@jemanov

Как добавить новый массив в самый конец многомерного массива произвольной глубины на php?

Существует массив произвольной глубины (до нескольких сот вложений), где каждый элемент массива: либо еще один заполненный массив, либо пустой массив. Но всегда массив!

Есть функция которая обходит этот массив, и:

Если находит "на краю" (на дне) глубины многомерного массива пустой массив, то заносит туда другой массив.
Если занесла, то прокручивает дальше, если не занесла и глубину больше нет останавливается.
Пример массива:

$test_mass['tk98op'] = array('p5ld2se'=>array(),
     '38hjp9'=>array('2we8t2'=>array(), '1142ln'=>array()),
     '669yo36'=>array('6318u7'=>array('22rv86'=>array(),
     '13we42'=>array()), 'jk66d3'=>array()));

Вот мой код:
function deep($mass, $b = 0)
    {
    foreach ($mass as $key=>$val)
        {
        if(is_array($val))
            {
            if(count($val) == 0)
                {
                /* не один из этих трех вариантов ничего не дописывает */
                //$val = array(1,4,217,432);
                //$mass = array_merge($val, array(1,4,217,432));
                //$mass[$key] = array(1,4,217,432);  
                }     
            deep($val, $b);
            }
        }
    return $mass;
    }

Как я полагаю проблема в полной адресации до глубины, но как ее решить универсально пока не понимаю. Прошу помощи.

Вот что мы должны иметь на выходе:
Array
(
    [tk98op] => Array
        (
            [p5ld2se] => Array
                (
                    [0] => 1
                    [1] => 4
                    [2] => 217
                    [3] => 432
                )
            [38hjp9] => Array
                (
                    [2we8t2] => Array
                        (
                            [0] => 1
                            [1] => 4
                            [2] => 217
                            [3] => 432
                        )
                    [1142ln] => Array
                        (
                            [0] => 1
                            [1] => 4
                            [2] => 217
                            [3] => 432
                        )
                )
            [669yo36] => Array
                (
                    [6318u7] => Array
                        (
                            [22rv86] => Array
                                (
                                    [0] => 1
                                    [1] => 4
                                    [2] => 217
                                    [3] => 432
                                )
                            [13we42] => Array
                                (
                                    [0] => 1
                                    [1] => 4
                                    [2] => 217
                                    [3] => 432
                                )
                        )
                    [jk66d3] => Array
                        (
                            [0] => 1
                            [1] => 4
                            [2] => 217
                            [3] => 432
                        )
                )
        )
)

P.S. Так же не особо понимаю, обойдет ли моя функция многомерный массив например с двумя (тремя, четырьмя, итд) глубокими ветками?
  • Вопрос задан
  • 416 просмотров
Пригласить эксперта
Ответы на вопрос 1
eldario666
@eldario666
1. Если ты захотел изменить элемент в массиве, то нужно указать ссылку на него &$val
2. Когда ты запускаешь рекурсию и тебе нужны данные, которые она возвращает, то их надо записывать $val = deep($val);
3. Нельзя в foreach использовать array_merge

Вот, что получилось:
$test_mass = [
    'tk98op' => [
        'p5ld2se' => [],
        '38hjp9'  => [
            '2we8t2' => [],
            '1142ln' => [],
        ],
        '669yo36' => [
            '6318u7' => [
                '22rv86' => [],
                '13we42' => [],
            ],
            'jk66d3' => [],
        ],
    ],
];

function deep($mass)
{
    foreach ($mass as $key => &$val) {
        $val = (\is_array($val) && \count($val) === 0)
            ?
            [1, 4, 217, 432]
            : deep($val);
    }
    unset($val);

    return $mass;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы