Как получить все комбинации из нескольких массивов?

Предположим, у меня есть эти 3 массива

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

Мне нужен этот вывод

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

Одна из моих проблем заключается в том, что мой массив может варьироваться от 3 до 15 различных массивов, и каждый из них может быть пустым (я мог бы добавить 0, чтобы не быть пустым) или иметь много значений.
Если у меня есть пустой массив, мне также нужно считать его допустимым столбцом. Эти значения будут использоваться для пополнения базы данных в определенном порядке.

Есть ли способ, которым я могу сделать это?

1

Решение

Сколько комбинаций?

Итак, сначала вопрос, сколько комбинаций? И ответ заключается в том, что вы должны умножить количество каждого массива друг с другом.

Итак (с = сумма1):

смассив 1 * смассив 2 * … * смассив n

И конкретно для вашего примера:

смассив 1 * смассив 2 * смассив 3 = 2 * 2 * 2 = 8

* 1 И если вам интересно, почему я выбрал c для суммы, из-за функции count () в php

Собираем все комбинации вместе

Как теперь получить все комбинации с количеством массивов, которые у нас есть?

Мы перебираем все наши комбинации, которые у нас уже есть (начиная с одной комбинации, «пустой комбинации» ($combinations = [[]];)), и для каждой комбинации мы проходим наш следующий массив данных и объединяем каждую комбинацию с каждой входной информацией в новую комбинацию.

Теперь мы делаем это, пока не получим желаемую длину для каждой комбинации.

Итак, в качестве примера:

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: не номер

Итак, как вы можете видеть в приведенном выше примере, у нас теперь есть все комбинации с длиной количества всех массивов, которые у нас есть.

Но чтобы получить только комбинации с желаемой длиной, мы перезаписываем массив результатов каждую итерацию, чтобы в конце в массиве результатов были только комбинации с ожидаемой длиной.

Код:

<?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);

?>

выход:

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

)

Для ассоциативных массивов вам нужно всего лишь сделать небольшую модификацию, а именно:

  1. Сначала назначьте ключи массивов переменной с помощью array_keys()например,

    $keys = array_keys($data);
    
  2. Используйте ключи во втором цикле foreach для доступа к массиву данных, то есть из:

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

    чтобы:

    foreach ($ data [$ клавиши [$ число]] как $ v2)
2

Другие решения

<?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;
}
?>

Выход:

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
)

)
0