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



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

$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]);

相关内容

  • 没有找到相关文章

最新更新