我有多个包含多个元素的数组,例如:
$array1 = (1,2)
$array2 = (3,4)
我需要为数组元素生成所有可能的组合。以给定的示例,输出应为:
1_3, 1_4, 2_3, 2_4
但是,问题是每个元素的数量和每个元素的数量都可能不同。因此,我们也可以采取类似的东西:
$array1 = (1,2,3,4)
$array2 = (5,6,7)
$array3 = (8,9,10,11,12)
和输出应该看起来像:
1_5_8, 1_5_9, 1_5_10 etc. until 4_7_12.
我如何实现这样的事情?我知道我应该使用foreach循环,但是我不知道如果每次执行算法时的" foreach"数量可能会有所不同。
真正感谢任何帮助:)
<?php
$array1 = [1,2,3,4];
$array2 = [5,6,7];
$array3 = [8,9,10,11,12];
$collection = [$array1,$array2,$array3];
$result = $collection[0];
array_shift($collection);
foreach($collection as $each_array){
$temp = [];
foreach($result as $each_sub_result){
foreach($each_array as $each_item){
$temp[] = $each_sub_result."_".$each_item;
}
}
$result = $temp;
}
print_r($result);
算法:
- 我们在
$collection
变量中收集所有数组。 - 现在,我们循环遍历每个单独的项目是一个数组的
$collection
变量的所有元素。 - 我已经完成了一个array_shift(),因为我们将
$collection
的第一个元素分配给$result
(所以我们不想再次迭代它们)。 - 我们维护
$temp
以存储临时结果。请注意,我们还使用$result
来存储临时结果,以便我们可以迭代并获得新的临时结果。临时,我的意思是 building 最终数组。例如:它以1
开头,然后是1_5
,然后最后1_5_8
。 - 循环完成后,我们将在
$result
中得到最终答案。
尝试这样的东西:
$array1 = array(1,2,3);
$array2 = array(4,5,6);
foreach ($array1 as $a1){
foreach ($array2 as $a2){
echo $a1 . '_' . $a2 . ', ';
}
}
您可以像您的意愿一样扩展它。
我在JS中很好,所以这就是为什么我在JS中进行算法的原因,您可以尝试在PHP中执行此操作,这没什么困难的。您只需要传递所有数组就是功能,其余的就应该由自己完成。让我知道是否有任何困惑。
var arr1 = [1, 2, 3];
var arr2 = [4, 5];
var arr3 = [6, 7, 8];
var numberOfArrays = -1;
function processArrays(concatWith = [], allArrays) {
const duplicateArray = [...allArrays];
for (var i = 0; i < allArrays.length; i++) {
const currentArray = duplicateArray.splice(0, 1);
currentArray[0].forEach(function (value) {
concatWith.push(value);
processArrays(concatWith, duplicateArray);
if (concatWith.length === numberOfArrays) {
console.log(concatWith.join('_'));
}
concatWith.pop();
});
}
}
function makeCombinations(arrayOfAllArrays = []) {
numberOfArrays = arrayOfAllArrays.length;
processArrays([], arrayOfAllArrays);
}
makeCombinations([arr1, arr2, arr3]);