@MarkSexton

Как найти ключ родителя в многомерном ассоциативном массиве?

Имеется многомерный ассоциативный массив, необходимо найти ключ родителя, что бы ему присвоить флаг "true".

Одной из особенностей данной задачи является то, что уровней может быть over 999+, соответственно, в новом массиве нужно составить некую последовательность родительский ключей, что бы в последствие разобрать его и подставить к выборке

like this...

$menu[1]['active'] = true;
$menu[1]['children'][1]['active'] = true;
$menu[1]['children'][1]['children'][1]['active'] = true;


Ниже вы увидите одну из моих безуспешных попыток реализовать данный функционал

$arr = array (
    [0] => array (
        ['name'] => '0 пункт',
        ['active'] => false,
        ['children']=> array(),
    ),
    [1] => array (
        ['name'] => '1 пункт',
        ['active'] => false,
        ['children']=> array(
            [0] => array(
                ['name'] => '1.0 пункт',
                ['active'] => false,
                ['children'] => array(),
            ),
            [1] => array(
                ['name'] => '1.1 пункт',
                ['active'] => false,
                ['children'] => array(
                    [0] => array(
                        ['name'] => '1.1.0 пункт',
                        ['active'] => true,
                        ['children'] => array(),
                    ),
                    [1] => array(
                        ['name'] => '1.1.0 пункт',
                        ['active'] => false,
                        ['children'] => array(),
                    )
                ),
            ),
            [2] => array(
                ['name'] => '1.2 пункт',
                ['active'] => false,
                ['children'] => array(),
            ),
        ),
    ),
    [2] => array (
        ['name'] => '2 пункт',
        ['active'] => false,
        ['children']=> array(),
    ),
);


function processArray($data, $level = 0, $output = []) {
    
    foreach($data as $key => $value) {

        if( $value['active'] ) {

            array_push($output, $level);

        } elseif( !empty($value['children']) ) {

            array_push($output, $key);

            processArray($value['children'], $key);

        }

    }

    return $output;

}

// Ожидаемый результат [1,1,1]

echo "<pre>";
var_dump(processArray($menu));
echo "</pre>";


Солгу, если скажу, что прошерстил весь Гугл, но что-то похожего не нашел... Да... я знаю, что это обычный рекурсивный проход по массиву, но у меня не получается выстроить связь родительских ключей с ключами дочерними.
  • Вопрос задан
  • 198 просмотров
Решения вопроса 1
twobomb
@twobomb
Замените
processArray($value['children'], $key);
на
$output = array_merge($output,processArray($value['children'], $key));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы