【问题标题】:Generate all combinations of elements between arrays生成数组之间元素的所有组合
【发布时间】:2019-08-06 14:59:53
【问题描述】:

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

$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”的数量都不同,我不知道该怎么办。

非常感谢任何帮助:)

【问题讨论】:

  • 提示:让它适用于两个数组,然后使用由两个数组组成的新数组作为下一对数组的一半。
  • 如果您对数组一无所知,那么在我看来,这就像一个 xy 问题。你确定这是真的需要吗?你能回到几步解释为什么需要这样做以及为什么需要这样做吗?
  • 很难解释...我有一个产品,数组是选项,它们的值是变体(例如,产品是 T 恤,我们有选项颜色,以及变体蓝色、黑色、红色的)。我有一家商店,我想生成所有可能的产品组合。这就是为什么每当我执行算法时我都有未知数量的选项和值 - 每个产品都是不同的。

标签: php arrays algorithm


【解决方案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]);

【讨论】:

    【解决方案2】:
    <?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 中得到最终答案。

    【讨论】:

    • 嘿,这很好!数组的数组......这是有道理的。谢谢!
    【解决方案3】:

    试试这样的:

    $array1 = array(1,2,3);
    $array2 = array(4,5,6);
    foreach ($array1 as $a1){
        foreach ($array2 as $a2){
           echo $a1 . '_' . $a2 . ', ';
        }
    }
    

    您可以随意扩展它。

    【讨论】:

    • 问题是我不知道我将拥有多少个数组。可能是 2,可能是 3,可能是 68。我知道 foreach 内部的 foreach 是如何工作的,但只有在数组数量不变的情况下才可行。
    猜你喜欢
    • 1970-01-01
    • 2022-12-20
    • 1970-01-01
    • 2021-12-06
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多