Поскольку это CopyOnWriteArrayList, совершенно безопасно удалять элементы при повторении с помощью forEach. Нет необходимости в причудливых алгоритмах.
list.forEach (e - & gt; {if (shouldRemove (e)) list.remove (e);});
EDIT: Ну, конечно, это работает, если вы хотите удалить элементы по ссылке, а не по положению.
Это должно сработать для вас:
Итак, что делает этот код?
1. Сколько комбинаций есть?
Итак, сначала вопрос, сколько комбинаций есть, и ответ заключается в том, что вам нужно умножить количество каждого массива друг на друга.
So (c = количество1):
carray 1 * carray 2 * ... * carray n
blockquote>И конкретный для вашего примера:
carray 1 * carray 2 = 3 * 3 = 9
blockquote>* 1 И если вам интересно, почему я выбрал
c
для суммы, из-за функцииcount()
в php2. Получение всех комбинаций
Как мы теперь получаем все комбинации с длиной количества всех массивов?
Ну, довольно просто, мы просто просматриваем все комбинации (с самого начала просто пустая комбинация (
[] == 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 ) )
вы можете использовать это: 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);