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