使用多数组生成组合

时间:2018-07-09 06:23:19

标签: php arrays

我想使用多数组生成组合,如果我有固定的数组设置,但是在多数组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 个答案:

答案 0 :(得分:4)

您不必为每个级别添加foreach。任何数量的组件都可以使用三个foreach

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]
]));