У меня есть вложенная древовидная структура, основанная на следующем массиве:
массив ( [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, а также кому-либо еще, просто дважды выполните указанные выше действия.