我有多个包含多个元素的数组,例如:
$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循环,但是我不知道如果每次执行算法时“前奏”的数量可以不同,该怎么办。
我们非常感谢您的帮助:)
答案 0 :(得分:1)
尝试这样的事情:
$array1 = array(1,2,3);
$array2 = array(4,5,6);
foreach ($array1 as $a1){
foreach ($array2 as $a2){
echo $a1 . '_' . $a2 . ', ';
}
}
您可以随意扩展它。
答案 1 :(得分:1)
<?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
变量的所有元素,其中每个单独的项都是一个数组。 $collection
的第一个元素分配给$result
(所以我们不想再遍历它们)。$temp
来存储临时结果。请注意,我们还使用$result
来存储临时结果,以便我们可以对其进行迭代并获得新的临时结果。 临时是指构建最终阵列。例如:它以1
开始,然后是1_5
,最后是1_5_8
。$result
中得到最终答案。答案 2 :(得分:-1)
我对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]);