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

1

Предположим, что у меня есть эти 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, чтобы просто не быть пустым) или иметь много значений. Если у меня есть пустой массив, мне также нужно считать это допустимым столбцом. Эти значения будут использоваться для заполнения базы данных в определенном порядке.

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

  • 0
    Я попытался использовать foreach () для каждого массива, но это не сработало
  • 0
    Давайте посмотрим. Отправьте это здесь.
Показать ещё 7 комментариев
Теги:
arrays
combinations
matrix

2 ответа

2
Лучший ответ

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

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

Итак (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:   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[$keys[$count]] as $v2)
0
<?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
        )

)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню