简体   繁体   English

如何从多个数组中获取所有组合?

[英]How to get all combinations from multiple arrays?

Supposing I have these 3 arrays假设我有这 3 个数组

$array1 = array(1,2);
$array2 = array(4,5);
$array3 = array(7,8);

I need this output我需要这个输出

1 4 7
1 4 8
1 5 7
1 5 8
2 4 7
2 4 8
2 5 7
2 5 8

One of my problems is that my array myght vary from 3 to 15 different arrays and each myght be empty (I might add a 0 just not to be empty) or have many values.我的问题之一是我的数组 myght 从 3 到 15 个不同的数组不等,每个 myght 都是空的(我可能会添加一个 0 只是为了不为空)或有很多值。 If I have an empty array I also need to count that as a valid column.如果我有一个空数组,我还需要将其计为有效列。 These values will be used to fill up a database in a specific order.这些值将用于以特定顺序填充数据库。

Is there any way I can do this?有什么办法可以做到这一点吗?

How many combinations are there?有多少组合?

So first the question how many combinations are there?那么首先问题是有多少种组合? And the answer is you have to multiply the amount of every array with each other.答案是您必须将每个数组的数量彼此相乘。

So (c = amount 1 ):所以(c = 数量1 ):

c array 1 * c array 2 * ... * c array n c数组 1 * c数组 2 * ... * c数组 n

And specific for your example:并具体针对您的示例:

c array 1 * c array 2 * c array 3 = 2 * 2 * 2 = 8 c数组 1 * c数组 2 * c数组 3 = 2 * 2 * 2 = 8

*1 And if you wonder why I chose c for amount, because of the function count() in php *1 如果你想知道为什么我选择 c 作为数量,因为 php 中的函数 count()

Getting all combinations together将所有组合组合在一起

How do we get now all combinations with the amount of arrays, which we have?我们现在如何获得具有数组数量的所有组合?

We loop through all our combinations, which we already have(Starting off with one combination, an "empty combination" ( $combinations = [[]]; )), and for each combination we go through our next data array and combine each combination with each input data to a new combination.我们遍历我们已有的所有组合(从一个组合开始,一个“空组合”( $combinations = [[]]; )),对于每个组合,我们遍历下一个数据数组并组合每个组合将每个输入数据组合成一个新的组合。

Now we do this until we get the desired length for each combination.现在我们这样做,直到我们为每个组合获得所需的长度。

So as an example:举个例子:

Array with the elements (Empty array is '[]'):

[
    [1, 2],
    [3, 4]
]

                               //↓ new combinations for the next iteration
                               │
array NAN*:

    Combinations:
                  - []         │  -> []
                                  │
array 1 [1,2]:      ┌─────────────┤
                    │             │
    Combinations:   v             v
                  - []    + 1  │  -> [1]  
                  - []    + 2  │  -> [2]   
                                  │
array 2 [3,4]:      ┌─────────────┤
                    │             │
    Combinations:   v             v
                  - []    + 3  │  -> [3]
                  - []    + 4  │  -> [4]
                  - [1]   + 3  │  -> [1,3]  //desired length 2 as we have 2 arrays 
                  - [1]   + 4  │  -> [1,4]  //desired length 2 as we have 2 arrays 
                  - [2]   + 3  │  -> [2,3]  //desired length 2 as we have 2 arrays 
                  - [2]   + 4  │  -> [2,4]  //desired length 2 as we have 2 arrays    
                               //↑ All combinations here

* NAN: not a number * NAN:不是数字

So as you can see in the above example we now have all combinations with the length of the amount of all arrays which we have.因此,正如您在上面的示例中所看到的,我们现在拥有所有数组的长度的所有组合。

But to get only the combinations with the desired length we are overwriting the result array each iteration, so that at the end only the combinations with the expected length are in the results array.但是为了只获得具有所需长度的组合,我们每次迭代都会覆盖结果数组,这样最后只有具有预期长度的组合才会出现在结果数组中。

Code:代码:

<?php

    $array1 = array(1,2);
    $array2 = array(4,5);
    $array3 = array(7,8);


    $combinations = [[]];
    $data = [
        $array1,
        $array2,
        $array3,
    ];
    $length = count($data);

    for ($count = 0; $count < $length; $count++) {
        $tmp = [];
        foreach ($combinations as $v1) {
            foreach ($data[$count] as $v2)
                $tmp[] = array_merge($v1, [$v2]);

        }
        $combinations = $tmp;
    }

    print_r($combinations);

?>

output:输出:

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 4
            [2] => 7
        )
    //...
    [7] => Array
        (
            [0] => 2
            [1] => 5
            [2] => 8
        )

)

For associative arrays you only have to do a slight modification, which is:对于关联数组,您只需稍作修改,即:

  1. First assign the arrays keys to a variable with array_keys() , eg首先使用array_keys()将数组键分配给变量,例如

    $keys = array_keys($data);
  2. Use the keys in the second foreach loop to access the data array, means from:使用第二个 foreach 循环中的键访问数据数组,表示来自:

     foreach ($data[$count] as $v2)

    to:到:

     foreach ($data[ $keys[$count] ] as $v2) foreach ($data[ $keys[$count] ] 作为 $v2)
<?php

$color = array('Blue','Red','Black','Green');
$size = array('L','M','S','XL','XXL');
$type  = array('Half selevs','full seleves');
$options = [
            $color,
            $size,
            $type,
        ];
$combinations = getCombinations($options);

print_r($combinations);

function getCombinations($options){ 

            $combinations = [[]];

            for ($count = 0; $count < count($options); $count++) {
                $tmp = [];
                foreach ($combinations as $v1) {
                    foreach ($options[$count] as $v2)
                        $tmp[] = array_merge($v1, [$v2]);

                }
                $combinations = $tmp;
            }

            return $combinations;
        }
?>

Output:输出:

Array
(
    [0] => Array
        (
            [0] => Blue
            [1] => L
            [2] => Half selevs
        )

    [1] => Array
        (
            [0] => Blue
            [1] => L
            [2] => full seleves
        )

    [2] => Array
        (
            [0] => Blue
            [1] => M
            [2] => Half selevs
        )

    [3] => Array
        (
            [0] => Blue
            [1] => M
            [2] => full seleves
        )

    [4] => Array
        (
            [0] => Blue
            [1] => S
            [2] => Half selevs
        )

    [5] => Array
        (
            [0] => Blue
            [1] => S
            [2] => full seleves
        )

    [6] => Array
        (
            [0] => Blue
            [1] => XL
            [2] => Half selevs
        )

    [7] => Array
        (
            [0] => Blue
            [1] => XL
            [2] => full seleves
        )

    [8] => Array
        (
            [0] => Blue
            [1] => XXL
            [2] => Half selevs
        )

    [9] => Array
        (
            [0] => Blue
            [1] => XXL
            [2] => full seleves
        )

    [10] => Array
        (
            [0] => Red
            [1] => L
            [2] => Half selevs
        )

    [11] => Array
        (
            [0] => Red
            [1] => L
            [2] => full seleves
        )

    [12] => Array
        (
            [0] => Red
            [1] => M
            [2] => Half selevs
        )

    [13] => Array
        (
            [0] => Red
            [1] => M
            [2] => full seleves
        )

    [14] => Array
        (
            [0] => Red
            [1] => S
            [2] => Half selevs
        )

    [15] => Array
        (
            [0] => Red
            [1] => S
            [2] => full seleves
        )

    [16] => Array
        (
            [0] => Red
            [1] => XL
            [2] => Half selevs
        )

    [17] => Array
        (
            [0] => Red
            [1] => XL
            [2] => full seleves
        )

    [18] => Array
        (
            [0] => Red
            [1] => XXL
            [2] => Half selevs
        )

    [19] => Array
        (
            [0] => Red
            [1] => XXL
            [2] => full seleves
        )

    [20] => Array
        (
            [0] => Black
            [1] => L
            [2] => Half selevs
        )

    [21] => Array
        (
            [0] => Black
            [1] => L
            [2] => full seleves
        )

    [22] => Array
        (
            [0] => Black
            [1] => M
            [2] => Half selevs
        )

    [23] => Array
        (
            [0] => Black
            [1] => M
            [2] => full seleves
        )

    [24] => Array
        (
            [0] => Black
            [1] => S
            [2] => Half selevs
        )

    [25] => Array
        (
            [0] => Black
            [1] => S
            [2] => full seleves
        )

    [26] => Array
        (
            [0] => Black
            [1] => XL
            [2] => Half selevs
        )

    [27] => Array
        (
            [0] => Black
            [1] => XL
            [2] => full seleves
        )

    [28] => Array
        (
            [0] => Black
            [1] => XXL
            [2] => Half selevs
        )

    [29] => Array
        (
            [0] => Black
            [1] => XXL
            [2] => full seleves
        )

    [30] => Array
        (
            [0] => Green
            [1] => L
            [2] => Half selevs
        )

    [31] => Array
        (
            [0] => Green
            [1] => L
            [2] => full seleves
        )

    [32] => Array
        (
            [0] => Green
            [1] => M
            [2] => Half selevs
        )

    [33] => Array
        (
            [0] => Green
            [1] => M
            [2] => full seleves
        )

    [34] => Array
        (
            [0] => Green
            [1] => S
            [2] => Half selevs
        )

    [35] => Array
        (
            [0] => Green
            [1] => S
            [2] => full seleves
        )

    [36] => Array
        (
            [0] => Green
            [1] => XL
            [2] => Half selevs
        )

    [37] => Array
        (
            [0] => Green
            [1] => XL
            [2] => full seleves
        )

    [38] => Array
        (
            [0] => Green
            [1] => XXL
            [2] => Half selevs
        )

    [39] => Array
        (
            [0] => Green
            [1] => XXL
            [2] => full seleves
        )

)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM