PHP - рекурсивное слияние массива на одной древовидной структуре, показывающее все перестановки
У меня есть дерево данных в многомерном массиве, как это:
[0] => Array
(
[0] => 14
[1] => 12
[2] => Array
(
[0] => Array
(
[0] => 16
[1] => 13
)
[1] => Array
(
[0] => 13
)
[2] => Array
(
[0] => 16
)
)
)
[1] => Array
(
[0] => 12
)
... и я пытаюсь написать алгоритм, который выводит это:
[0] => Array
(
[0] => 14
[1] => 12
[2] => 16
[3] => 13
)
[1] => Array
(
[0] => 14
[1] => 12
[0] => 13
)
[2] => Array
(
[0] => 14
[1] => 12
[0] => 16
)
[3] => Array
(
[0] => 12
)
Лучший способ, которым я могу выразить это рекурсивное слияние массивов, которое показывает все возможные перестановки объединенных массивов для всех путей через заданное дерево массивов.
Самое близкое, что мне удалось, это:
[0] => Array
(
[0] => 14
[1] => 12
[2] => 16
[3] => 13
)
[1] => Array
(
[0] => 13
)
[2] => Array
(
[0] => 16
)
[3] => Array
(
[0] => 12
)
Код, который выводит это:
$return = [];
function enumerateTreePaths($arr, &$return, $path_k = 0)
{
foreach ($arr as $el)
{
if (is_array($el))
{
foreach($el as $i)
{
enumerateTreePaths($i, $return, $path_k++);
}
}
else
{
$return[$path_k][] = $el;
}
}
}
Извиняюсь за небрежные соглашения об именах. Рекурсия == расплавление мозга.
Я явно должен выполнить какое-то слияние массивов, но не смог выработать точную логику.
Спасибо за любой вклад.
О, это на самом деле тоже завернуто в foreach;
foreach ($trees as $tree)
{
$return = [];
enumerateTreePaths($tree, $return);
$paths = array_merge($paths, $return);
}