Как соотнести каждый элемент строки массива с каждым элементом других строк этого массива?
Есть массив следующего вида:
Array
(
[0] => Array
(
[0] => aa
[1] => bb
[2] => cc
)
[1] => Array
(
[0] => dd
[1] => ee
[2] => ff
[3] => gg
)
[2] => Array
(
[0] => hh
[1] => ii
)
)
Не могу понять как реализовать перебор, чтобы результат был такой: aa dd hh, aa dd ii, aa ee hh, aa ee ii, и так далее. Важно, что количество строк как и количество элементов в каждой строке может быть разным.
Прошу помощи!
Ответы (2 шт):
Автор решения: Vladimir Gonchar
→ Ссылка
То, что Вы хотите получить, называется декартовым произведением.
Можете воспользоваться библиотекой: https://github.com/bpolaszek/cartesian-product.
Есть и решения без библиотек, просто фунция (взял отсюда):
function cartesian($input) {
$result = [];
foreach ($input as $key => $values) {
if (empty($values)) {
continue;
}
if (empty($result)) {
foreach($values as $value) {
$result[] = array($key => $value);
}
} else {
$append = [];
foreach($result as &$product) {
$product[$key] = array_shift($values);
$copy = $product;
foreach($values as $item) {
$copy[$key] = $item;
$append[] = $copy;
}
array_unshift($values, $product[$key]);
}
$result = array_merge($result, $append);
}
}
return $result;
}
$input = [
['aa', 'bb', 'cc'],
['dd', 'ee', 'ff', 'gg'],
['hh', 'ii']
];
print_r(cartesian($input));
Автор решения: Kvandaik
→ Ссылка
foreach ($arr as $key => $value) {
# code...
$ars[]=count($value);
}
$rt=max($ars);
foreach ($arr as $key => $value) {
foreach ($value as $key1 => $value1) {
for ($i=0; $i < $rt; $i++) {
if($key1==$i){
$bon[$i][]=$value1;
}
}
}
}
print_r($bon);