生成数组之间元素的所有组合

时间:2019-03-15 13:52:38

标签: php arrays algorithm

我有多个包含多个元素的数组,例如:

$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循环,但是我不知道如果每次执行算法时“前奏”的数量可以不同,该怎么办。

我们非常感谢您的帮助:)

3 个答案:

答案 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变量的所有元素,其中每个单独的项都是一个数组。
  • 我已经完成了array_shift()的操作,因为我们将$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]);