代码之家  ›  专栏  ›  技术社区  ›  Jagjeet Singh

使用多数组生成组合

  •  1
  • Jagjeet Singh  · 技术社区  · 8 年前

    我想使用多数组生成组合,如果我有固定数组集,这是可能的,但是在多数组的情况下 foreach 没有帮助,例如:

    $first_array = [1,2,3];
    
    $second_array = [1];
    

    我想要这样的输出,总计 3种组合 以下内容:

    First Combination : 11
    Second Combination : 21
    Third Combination : 31
    

    如果在第二个数组中有另一个数组值,如下所示:

    $second_array = [1,2];
    

    那么输出将是这样的,总计 6种组合 以下内容:

    // My Solution
    $i = 1;
    foreach ($first_array as $o) {
     foreach ($second_array as $s) {
      echo $i . ' : ' . $o . $s;
      echo "<br/>";
      $i++;
     }
    }
    
    1 : 11
    2 : 12
    3 : 21
    4 : 22
    5 : 31
    6 : 32
    

    我可以用 foreach公司 但是,如果我有多个数组,例如,如果还有第三个数组:

    $third_array = [1,2,3];
    

    那么输出将是这样的,总计 18种组合 以下内容:

    // My Solution
    $i = 1;
    foreach ($first_array as $o) {
     foreach ($second_array as $s) {
      foreach ($third_array as $t) {
       echo $i . ' : ' . $o . $s . $t;
       echo "<br/>";
       $i++;
      }
     }
    }
    
    1 : 111
    2 : 112
    3 : 113
    4 : 121
    5 : 122
    6 : 123
    7 : 211
    8 : 212
    9 : 213
    10 : 221
    11 : 222
    12 : 223
    13 : 311
    14 : 312
    15 : 313
    16 : 321
    17 : 322
    18 : 323
    

    有没有最简单的解决方案来实现这一点? foreach公司 是吗? 因为如果有另一个数组集,如下所示:

    [1,2,3]
    [1,2]
    [1,2,3]
    [1,2,3,4]
    [1,2,3,4,5,6]
    
    1 回复  |  直到 8 年前
        1
  •  4
  •   mleko    8 年前

    你不必加 foreach 每一个级别。对于任何数量的组件,三个foreaches都可以。

    function array_permute($arrays) {
        $set = array_shift($arrays);
        foreach($arrays as $sub) {
            $newSet = [];
            foreach($set as $prefix) {
                foreach($sub as $suffix){
                    $newSet[] = $prefix.$suffix;
                }
            }
            $set = $newSet;
        }
        return $set;
    }
    

    用法

    print_r(array_permute([
        [1,2,3],
        [1,2],
        [1,2,3]
    ]));
    

    会导致

    Array
    (
        [0] => 111
        [1] => 112
        [2] => 113
        [3] => 121
        [4] => 122
        [5] => 123
        [6] => 211
        [7] => 212
        [8] => 213
        [9] => 221
        [10] => 222
        [11] => 223
        [12] => 311
        [13] => 312
        [14] => 313
        [15] => 321
        [16] => 322
        [17] => 323
    )
    

    使用更多组件

    print_r(array_permute([
        [1,2,3],
        [1,2],
        [1,2,3],
        [1,2,3,4],
        [1,2,3,4,5,6]
    ]));
    
    推荐文章