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);
    }

0 ответов

Другие вопросы по тегам