Рекурсивный поиск и удаление в массиве?

Я работаю с многомерным массивом, я хочу иметь возможность удалить массив (и все дочерние элементы), которые соответствуют идентификатору.

Функция, которую я пробовал:

function removeKey($key, $array, $childKey = 'children'){
    if(isset($array[$key])){
        unset($array[$key]);
        return $array;
    }

    foreach($array as &$item)
        if(isset($item[$childKey]))
            $item = removeKey($key, $item[$childKey], $childKey);

    return $array;
}

Мой примерный массив:

Array
(
    [5] => Array
        (
            [id] => 5
            [parent_id] => 
            [menu_title] => Drinks
            [page_title] => Drinks
            [status] => 1
            [products] => 0
        )

    [1] => Array
        (
            [id] => 1
            [parent_id] => 
            [menu_title] => Electronics
            [page_title] => Electronics
            [status] => 1
            [products] => 0
            [children] => Array
                (
                    [2] => Array
                        (
                            [id] => 2
                            [parent_id] => 1
                            [menu_title] => Computers
                            [page_title] => Computers
                            [status] => 1
                            [products] => 0
                            [children] => Array
                                (
                                    [4] => Array
                                        (
                                            [id] => 4
                                            [parent_id] => 2
                                            [menu_title] => Apple
                                            [page_title] => Apple - Imacs and Macbooks
                                            [status] => 1
                                            [products] => 0
                                        )

                                )

                        )

                    [3] => Array
                        (
                            [id] => 3
                            [parent_id] => 1
                            [menu_title] => Mobile Phones
                            [page_title] => Mobile Phones
                            [status] => 1
                            [products] => 0
                        )

                )

        )

)

и результат, который я ищу (вызов функции с (2, $array, 'children')):

Array
(
    [5] => Array
        (
            [id] => 5
            [parent_id] => 
            [menu_title] => Drinks
            [page_title] => Drinks
            [status] => 1
            [products] => 0
        )

    [1] => Array
        (
            [id] => 1
            [parent_id] => 
            [menu_title] => Electronics
            [page_title] => Electronics
            [status] => 1
            [products] => 0
            [children] => Array
                (

                    [3] => Array
                        (
                            [id] => 3
                            [parent_id] => 1
                            [menu_title] => Mobile Phones
                            [page_title] => Mobile Phones
                            [status] => 1
                            [products] => 0
                        )

                )

        )

)

но результат, который я получаю,

Array
(
    [5] => Array
        (
            [id] => 5
            [parent_id] => 
            [menu_title] => Drinks
            [page_title] => Drinks
            [status] => 1
            [products] => 0
        )

    [1] => Array
        (
            [3] => Array
                (
                    [id] => 3
                    [parent_id] => 1
                    [menu_title] => Mobile Phones
                    [page_title] => Mobile Phones
                    [status] => 1
                    [products] => 0
                )

        )

)

Я понятия не имею, что здесь происходит!


person Hailwood    schedule 21.08.2012    source источник


Ответы (2)


Вы можете упростить ситуацию, используя только ссылки.

function removeKey($key, &$array, $childKey = 'children'){
    if(isset($array[$key])){
        unset($array[$key]);
        return;
    }

    foreach($array as &$item)
        if(isset($item[$childKey]))
            removeKey($key, $item[$childKey], $childKey);
}

Пример:

$arr = array(...);
removeKey('key', $arr, $chilKey);
// Just continue using $arr
person Daniel M    schedule 21.08.2012
comment
Ура, это работает, но что я на самом деле делал не так, чтобы получить вышеуказанный результат? - person Hailwood; 21.08.2012
comment
Честно говоря, не проверял, но вы заменяете узел $item (тот, который содержит «дочерний» узел) очищенным массивом. Однако использование ссылок должно быть намного проще. - person Daniel M; 21.08.2012

А многомерный массив? Я искал пару часов для этого решения, нигде не нашел оптимального решения. так я сам написал

function allow_keys($arr, $keys)
    {
        $saved = [];

        foreach ($keys as $key => $value) {
            if (is_int($key) || is_int($value)) {
                $keysKey = $value;
            } else {
                $keysKey = $key;
            }
            if (isset($arr[$keysKey])) {

                $saved[$keysKey] = $arr[$keysKey];
                if (is_array($value)) {

                    $saved[$keysKey] = allow_keys($saved[$keysKey], $keys[$keysKey]);
                }
            }
        }
        return $saved;
    }

использование: пример

$array = [
        'key1' => 'kw',
        'loaa'=> ['looo'],
        'k'    => [
            'prope' => [
                'prop'  => ['proo', 'prot', 'loolooo', 'de'],
                'prop2' => ['hun' => 'lu'],
            ],
            'prop1' => [

            ],
        ],
    ];

вызов: пример

allow_keys($array, ['key1', 'k' => ['prope' => ['prop' => [0, 1], 'prop2']]])

выход:

Array ( [key1] => kw [k] => Array ( [prope] => Array ( [prop] => Array ( [0] => proo [1] => prot ) [prop2] => Array ( [hun] => lu ) ) ) ) 

поэтому вы получаете только необходимые ключи из многомерного массива. он не ограничен только для «многомерного», вы можете использовать его, передав массив, например

['key1', 'loaa']

вывод, который вы получаете:

Array ( [key1] => kw [loaa] => Array ( [0] => looo ) )

надеюсь, что кто-то поможет этому, так как я много искал, и ничего не нашел. ваше здоровье!

person Georgy Sharapov    schedule 19.08.2017
comment
возможно, это не прямой ответ на этот вопрос, но когда вы проводите исследование в Google по вопросу Рекурсивный поиск и удаление в массиве, вы находите эти темы, которые не отвечают на этот вопрос правильно. путь. - person Georgy Sharapov; 20.08.2017
comment
Пожалуйста, не публикуйте свой ответ повторно. Вы должны отредактировать свой ответ, чтобы он соответствовал вопросу. - person paper1111; 20.08.2017