【问题标题】:Best way to create combination of each element using PHP使用 PHP 创建每个元素组合的最佳方法
【发布时间】:2019-02-20 02:59:23
【问题描述】:

这是我的数组:

[options] => Array
    (
        [1] => Array
            (
                [0] => Red
                [1] => Yellow
                [2] => Blue
                [3] => Green
            )

        [2] => Array
            (
                [0] => 28
                [1] => 30
                [2] => 32
                [3] => 34
            )

        [3] => Array
            (
                [0] => Short Neck
                [1] => Full Neck
                [2] => Round Neck
            )

        [5] => Array
            (
                [0] => Bodycon
                [1] => Empire Waist
                [2] => High-Low
            )

    )

想要创建这样的字符串:
Red-28-短颈紧身衣
Red-28-短颈-帝国腰部
Red-28-短颈-高-低

Red-28-Full Neck-Bodycon
Red-28-Full Neck-Empire 腰部
Red-28-全颈-高-低

红色 28 圆颈紧身衣
红色 28 圆领-帝国腰部
红色 28 圆领-高-低

Red-30-短颈紧身衣
Red-30-短颈-帝国腰部
Red-30-短颈-高-低

Red-30-Full Neck-Bodycon
Red-30-Full Neck-Empire 腰部
红色 30-全颈-高-低

红色 30 圆颈紧身衣
红色 30 圆领-帝国腰部
红色 30 圆领-高-低

等等...

对于每个值

谢谢

【问题讨论】:

标签: php cartesian-product


【解决方案1】:

您可以使用递归函数来构建结果数组,例如:

function combine($arr) {
    if (count($arr) === 1) {
        return array_shift($arr);
    } 
    $items = array_shift($arr);

    $data = [];
    foreach ($items as $item) {
        foreach (combine($arr) as $value) {
            $data[] = $item . ' ' . $value;
        }
    } 
    return $data;
}

并使用示例:

$items = [
    [            
        'Red',
        'Yellow',
        'Blue',
        'Green',
    ],
    [
        28,
        30,
        32,
        34
    ],
    [
        'Short Neck',
        'Full Neck',
        'Round Neck'
    ],
    [
        'Bodycon',
        'Empire Waist',
        'High-Low'
    ]
];

$result = combine($items);

【讨论】:

    【解决方案2】:

    您可以使用 cmets 中线程中的笛卡尔()函数,或者像这样的简单例程:

    $join = [];
    foreach( $myarray[ 'options' ] as $block ) :
    
        foreach( $block as $i => $value ) :
    
            $join[ $i ][] = $value;
    
        endforeach;
    
    endforeach;
    
    foreach( $join as $string ) :
    
        echo implode( '-', $string ) . '<br>';
    
    endforeach;
    

    输出:

    Red-28-Short Neck-Bodycon
    Yellow-30-Full Neck-Empire Waist
    Blue-32-Round Neck-High-Low
    Green-34
    

    不是很漂亮,但应该可以为单个用例完成工作。

    【讨论】:

      【解决方案3】:

      给定你的数组:

      $items = [
          1=>[            
              'Red',
              'Yellow',
              'Blue',
              'Green',
          ],
          2=>[
              28,
              30,
              32,
              34
          ],
          3=>[
              'Short Neck',
              'Full Neck',
              'Round Neck'
          ],
          5=>[
              'Bodycon',
              'Empire Waist',
              'High-Low'
          ]
      ];
      

      这是实现它的最简单且消耗更少的方法

      $items=array_values($items);
      $result=[];
      
      
      foreach($items[0] as $k1=>$v1){
          foreach($items[1] as $k2=>$v2){
              foreach($items[2] as $k3=>$v3){
                  foreach($items[3] as $k4=>$v4){
                      $result[]=$v1.' '.$v2.' '.$v3.' '.$v4;
                  }
              }
          }   
      }
      

      如果你想从上面的代码中删除一个步骤,你可以使用你的数组来代替

      $result=[];
      
      
          foreach($items[1] as $k1=>$v1){
              foreach($items[2] as $k2=>$v2){
                  foreach($items[3] as $k3=>$v3){
                      foreach($items[5] as $k4=>$v4){
                          $result[]=$v1.' '.$v2.' '.$v3.' '.$v4;
                      }
                  }
              }   
          }
      

      注意我们去掉array_values这一步

      这些代码输出一个包含 144 个条目的数组,表示按预期顺序排列的所有组合。

      【讨论】:

        猜你喜欢
        • 2022-07-07
        • 2011-04-17
        • 2012-03-13
        • 2016-09-30
        • 1970-01-01
        • 2012-06-25
        • 1970-01-01
        • 1970-01-01
        • 2015-07-29
        相关资源
        最近更新 更多