Прокрутите многомерный массив и удалите определенные ключи

У меня есть вложенная древовидная структура, основанная на следующем массиве:

 массив
 (
     [1] => Массив
         (
             [id] => 1
             [parent] => 0
             [name] => Начальная страница
             [uri] => 125
             [basename] => index.php
             [ребенок] => 
         )

     [23] => Массив
         (
             [id] => 23
             [parent] => 0
             [name] => События
             [uri] => 0
             [basename] => 
             [child] => Массив
                 (
                     [24] => Массив
                         (
                             [id] => 24
                             [parent] => 23
                             [name] => Публичные новости
                             [uri] => 0
                             [basename] => 
                             [child] => Массив
                                 (
                                     [27] => Массив
                                         (
                                             [id] => 27
                                             [parent] => 24
                                             [name] => Добавить
                                             [uri] => 100
                                             [basename] => news.public.add.php
                                             [ребенок] => 
                                         )

                                     [28] => Массив
                                         (
                                             [id] => 28
                                             [parent] => 24
                                             [name] => Обзор
                                             [uri] => 101
                                             [basename] => news.public.overview.php
                                             [ребенок] => 
                                         )

                                 )

                         )

                     [25] => Массив
                         (
                             [id] => 25
                             [parent] => 23
                             [имя] => Частные новости
                             [uri] => 0
                             [basename] => 
                             [child] => Массив
                                 (
                                     [29] => Массив
                                         (
                                             [id] => 29
                                             [родительский] => 25
                                             [name] => Добавить
                                             [uri] => 67
                                             [basename] => news.private.add.php
                                             [ребенок] => 
                                         )

                                     [30] => Массив
                                         (
                                             [id] => 30
                                             [родительский] => 25
                                             [name] => Обзор
                                             [uri] => 68
                                             [basename] => news.private.overview.php
                                             [ребенок] => 
                                         )

                                 )

                         )

                     [26] => Массив
                         (
                             [id] => 26
                             [parent] => 23
                             [name] => Календарь
                             [uri] => 0
                             [basename] => 
                             [child] => Массив
                                 (
                                     [31] => Массив
                                         (
                                             [id] => 31
                                             [parent] => 26
                                             [name] => Добавить
                                             [uri] => 69
                                             [basename] => news.event.add.php
                                             [ребенок] => 
                                         )

                                     [32] => Массив
                                         (
                                             [id] => 32
                                             [parent] => 26
                                             [name] => Обзор
                                             [uri] => 70
                                             [basename] => news.event.overview.php
                                             [ребенок] => 
                                         )

                                 )

                         )

                 )

         )
 ) 

Я ищу функцию для цикла (рекурсивного?) Через массив и удаления некоторых ключей.

В моей системе я могу разрешить пользователям определенные функции / страницы, и если я откажу в доступе ко всему «блоку» «События», массив будет выглядеть так:

 array (1 => array ('id' => '1', 'parent' => '0', 'name' => 'Начальная страница', 'uri' => '125', 'basename' => ' index.php ',' child '=>' ',), 23 => array (' id '=>' 23 ',' parent '=>' 0 ',' name '=>' Events ',' uri ' => '0', 'basename' => NULL, 'child' => array (24 => array ('id' => '24', 'parent' => '23', 'name' => 'Public ('id' => '25', 'parent' => '23 ',' name '=>' Частные новости ',' uri '=>' 0 ',' basename '=> NULL,' child '=>' ',), 26 => array (' id '=> '26 ',' parent '=>' 23 ',' name '=>' Calendar ',' uri '=>' 0 ',' basename '=> NULL,' child '=>' ',),),))) 

Как вы можете видеть выше, весь «блок» «События» бесполезен прямо сейчас, потому что нет никакой страницы, связанной с каждым вариантом. Поэтому мне нужно найти все «ключи», где «basename» имеет значение null AND, где child не является массивом или где массив пуст и удаляет их. Я нашел эту функцию при поиске на сайте:

function searchAndDestroy(&$a, $key, $val){ foreach($a as $k => &$v){ if(is_array($v)){ $r = searchAndDestroy($v, $key, $val); if($r) { unset($a[$k]); } } elseif ($key == $k && $val == $v) { return true; } } return false; } 

Его можно использовать для удаления ключа в любом месте массива, но только в одном случае, например, удалите все ключи, где «parent» равно «23». Но мне нужно найти и удалить (удалить) все ключи, где «basename» равно N, и где child не является массивом или где массив пуст. Может ли кто-нибудь помочь мне и, возможно, настроить функцию выше?

Спасибо,

Вместо того, чтобы ставить тест, для которого элементы уничтожаются в функции поиска, передайте функцию для проверки целей.

 function searchAndDestroy(&$a, $targetp){ foreach($a as $k => &$v){ if(is_array($v)){ searchAndDestroy($v, $targetp); } if ($targetp($k, $v)) { unset($a[$k]); } } } searchAndDestroy($menu, function ($k, $v) { return is_array($v) && array_key_exists('basename', $v) && empty($v['basename']) && (empty($v['child']) || count($v['child']) == 0); }); с function searchAndDestroy(&$a, $targetp){ foreach($a as $k => &$v){ if(is_array($v)){ searchAndDestroy($v, $targetp); } if ($targetp($k, $v)) { unset($a[$k]); } } } searchAndDestroy($menu, function ($k, $v) { return is_array($v) && array_key_exists('basename', $v) && empty($v['basename']) && (empty($v['child']) || count($v['child']) == 0); }); 

Для PHP <5.3 (или если вы вызываете searchAndDestroy с этой функцией в более чем одном месте), назовите функцию и передайте имя, а не анонимную функцию.

Решила! Добавил эту функцию в мой класс:

  частная функция cleanTree (& $ arr) {
     foreach ($ arr как $ key => & $ item) {
         if (! $ item ["child"] && empty ($ item ["basename"])) {
             снята с охраны ($ обр [$ ключ]); 

  }elseif(is_array($item["child"])){ if(count($item["child"]) == 0){ unset($arr[$item["id"]]); }else{ $this->cleanTree($item["child"]); } } } с  }elseif(is_array($item["child"])){ if(count($item["child"]) == 0){ unset($arr[$item["id"]]); }else{ $this->cleanTree($item["child"]); } } } 

}

Чтобы удалить ненужные элементы на уровне (-ях) ROOT, а также кому-либо еще, просто дважды выполните указанные выше действия.