Как соотнести каждый элемент строки массива с каждым элементом других строк этого массива?

Есть массив следующего вида:

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

То, что Вы хотите получить, называется декартовым произведением.

  1. Можете воспользоваться библиотекой: https://github.com/bpolaszek/cartesian-product.

  2. Есть и решения без библиотек, просто фунция (взял отсюда):

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);
→ Ссылка