有多少种组合?
那么首先的问题是有多少种组合?答案是你必须将每个数组的数量相乘。
所以(c = 数量1):
carray 1 * carray 2 * ... * carray n
具体到你的例子:
c数组 1 * c数组 2 * c数组 3 = 2 * 2 * 2 = 8
*1 如果你想知道为什么我选择 c 作为数量,因为 php 中的函数 count()
将所有组合放在一起
我们现在如何获得所有组合以及我们拥有的数组数量?
我们循环遍历我们已经拥有的所有组合(从一个组合开始,一个“空组合”($combinations = [[]];)),对于每个组合,我们遍历下一个数据数组并将每个组合与每个组合输入数据到一个新的组合。
现在我们这样做,直到我们为每个组合获得所需的长度。
举个例子:
Array with the elements (Empty array is '[]'):
[
[1, 2],
[3, 4]
]
//↓ new combinations for the next iteration
│
array NAN*:
Combinations:
- [] │ -> []
│
array 1 [1,2]: ┌─────────────┤
│ │
Combinations: v v
- [] + 1 │ -> [1]
- [] + 2 │ -> [2]
│
array 2 [3,4]: ┌─────────────┤
│ │
Combinations: v v
- [] + 3 │ -> [3]
- [] + 4 │ -> [4]
- [1] + 3 │ -> [1,3] //desired length 2 as we have 2 arrays
- [1] + 4 │ -> [1,4] //desired length 2 as we have 2 arrays
- [2] + 3 │ -> [2,3] //desired length 2 as we have 2 arrays
- [2] + 4 │ -> [2,4] //desired length 2 as we have 2 arrays
//↑ All combinations here
* NAN:不是数字
正如您在上面的示例中看到的那样,我们现在拥有所有组合以及我们拥有的所有数组数量的长度。
但是为了只获得具有所需长度的组合,我们每次迭代都会覆盖结果数组,这样最后只有具有预期长度的组合才会出现在结果数组中。
代码:
<?php
$array1 = array(1,2);
$array2 = array(4,5);
$array3 = array(7,8);
$combinations = [[]];
$data = [
$array1,
$array2,
$array3,
];
$length = count($data);
for ($count = 0; $count < $length; $count++) {
$tmp = [];
foreach ($combinations as $v1) {
foreach ($data[$count] as $v2)
$tmp[] = array_merge($v1, [$v2]);
}
$combinations = $tmp;
}
print_r($combinations);
?>
输出:
Array
(
[0] => Array
(
[0] => 1
[1] => 4
[2] => 7
)
//...
[7] => Array
(
[0] => 2
[1] => 5
[2] => 8
)
)
对于关联数组,您只需稍作修改,即:
-
首先将数组键分配给带有array_keys()的变量,例如
$keys = array_keys($data);
-
使用第二个foreach循环中的keys来访问数据数组,表示from:
foreach ($data[$count] as $v2)
到:
foreach ($data[$keys[$count]] as $v2)