假设我有这 3 个数组
$array1 = array(1,2);
$array2 = array(4,5);
$array3 = array(7,8);
我需要这个输出
1 4 7
1 4 8
1 5 7
1 5 8
2 4 7
2 4 8
2 5 7
2 5 8
我的一个问题是我的数组可能有 3 到 15 个不同的数组,每个数组可能都是空的(我可能会添加 0 只是为了不为空)或者有很多值。 如果我有一个空数组,我还需要将其计为有效列。这些值将用于按特定顺序填充数据库。
有什么办法可以做到这一点吗?
最佳答案
有多少种组合?
那么首先要问有多少种组合?答案是您必须将每个数组的数量相乘。
所以(c = 金额1):
carray 1 * carray 2 * ... * carray n
具体针对您的示例:
carray 1 * carray 2 * carray 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循环中使用键访问数据数组,表示来自:
foreach ($data[$count] as $v2)
到:
foreach ($data[$keys[$count]] as $v2)
关于php - 如何从多个数组中获取所有组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30512570/