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

Предположим, что у меня есть эти 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 

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

Есть ли способ сделать это?

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

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

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

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

c array 1 * c array 2 * … * c array n

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

c массив 1 * c массив 2 * c массив 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: vv - [] + 1 │ -> [1] - [] + 2 │ -> [2] │ array 2 [3,4]: ┌─────────────┤ │ │ Combinations: vv - [] + 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 [ $ 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; } ?> 

Вывод:

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