функция для печати всей комбинации из числа массивов, данных [duplicate]

Поскольку это CopyOnWriteArrayList, совершенно безопасно удалять элементы при повторении с помощью forEach. Нет необходимости в причудливых алгоритмах.

list.forEach (e - & gt; {if (shouldRemove (e)) list.remove (e);});

EDIT: Ну, конечно, это работает, если вы хотите удалить элементы по ссылке, а не по положению.

1
задан Rizier123 19 March 2015 в 14:02
поделиться

2 ответа

Это должно сработать для вас:

Итак, что делает этот код?

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

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

So (c = количество1):

carray 1 * carray 2 * ... * carray n

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

carray 1 * carray 2 = 3 * 3 = 9

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

2. Получение всех комбинаций

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

Ну, довольно просто, мы просто просматриваем все комбинации (с самого начала просто пустая комбинация ([] == array())), которую мы уже имеем со следующим массивом, пока мы не получим желаемую длину, которую хотим, в этом случае последнюю итерацию последнего массива.

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

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]
                  - [1]   + 4  |  -> [1,4]
                  - [2]   + 3  |  -> [2,3]
                  - [2]   + 4  |  -> [2,4]     
                               //^ All combinations here

* NAN: не число

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

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

код:

<?php

    $data = [
            35 => ["green", "red", "brown"],
            36 => ["fox", "house", "dog"]
        ];

    $combinations = [[]];
    $comKeys = array_keys($data);


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

        }
        $combinations = $tmp;
    }

    print_r($combinations);

?>

выход:

Array
(
    [0] => Array
        (
            [35] => green
            [36] => fox
        )

    [1] => Array
        (
            [35] => green
            [36] => house
        )

    [2] => Array
        (
            [35] => green
            [36] => dog
        )

    [3] => Array
        (
            [35] => red
            [36] => fox
        )

    [4] => Array
        (
            [35] => red
            [36] => house
        )

    [5] => Array
        (
            [35] => red
            [36] => dog
        )

    [6] => Array
        (
            [35] => brown
            [36] => fox
        )

    [7] => Array
        (
            [35] => brown
            [36] => house
        )

    [8] => Array
        (
            [35] => brown
            [36] => dog
        )

)
3
ответ дан Rizier123 15 August 2018 в 17:05
поделиться
  • 1
    Это действительно лучшее решение, рекурсия не требуется. Обратите внимание, что не все серверы имеют новейший PHP и не поддерживают новый синтаксис массива. Это может сбить с толку некоторых людей. – KIKO Software 20 March 2015 в 02:42
  • 2
    работает отлично. Теперь я собираюсь изучить, как это работает. Большое спасибо чуваку! :) – David 20 March 2015 в 08:05
  • 3
    @David Добро пожаловать! Хороший день: D – Rizier123 20 March 2015 в 08:06

вы можете использовать это: https://gist.github.com/jwage/11193216

или

используйте следующий код:

<?php
$attributes = [
    [
        'P', 'M', 'G', 'XG'
    ],
    [
        'Vermelho', 'Amarelo', 'Verde'
    ],
];



function array_mix($leftItems, $rightItems)
{
    $results   = [];
    foreach ($leftItems as $leftItem) {
        foreach ($rightItems as $key => $rightItem) {
            $results[] = array_merge((array) $leftItem, (array) $rightItem);
        }
    }
    return $results;
}

$y = $attributes[0];

foreach($attributes as $key => $attrs) {
    if(isset($attributes[$key + 1]) && is_array($attributes[$key + 1])) {
        $y = array_mix($y, $attributes[$key + 1]);
    }
}

var_dump($y);
0
ответ дан Dinaerte Neto 15 August 2018 в 17:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: