Php 循环多维数组并移除某些键

Php 循环多维数组并移除某些键,php,arrays,menu,nested,recursion,Php,Arrays,Menu,Nested,Recursion,我有一个嵌套的树结构,它基于下面的数组: Array ( [1] => Array ( [id] => 1 [parent] => 0 [name] => Startpage [uri] => 125 [basename] => index.php [child] => ) [23] => Array

我有一个嵌套的树结构,它基于下面的数组:

Array ( [1] => Array ( [id] => 1 [parent] => 0 [name] => Startpage [uri] => 125 [basename] => index.php [child] => ) [23] => Array ( [id] => 23 [parent] => 0 [name] => Events [uri] => 0 [basename] => [child] => Array ( [24] => Array ( [id] => 24 [parent] => 23 [name] => Public news [uri] => 0 [basename] => [child] => Array ( [27] => Array ( [id] => 27 [parent] => 24 [name] => Add [uri] => 100 [basename] => news.public.add.php [child] => ) [28] => Array ( [id] => 28 [parent] => 24 [name] => Overview [uri] => 101 [basename] => news.public.overview.php [child] => ) ) ) [25] => Array ( [id] => 25 [parent] => 23 [name] => Private news [uri] => 0 [basename] => [child] => Array ( [29] => Array ( [id] => 29 [parent] => 25 [name] => Add [uri] => 67 [basename] => news.private.add.php [child] => ) [30] => Array ( [id] => 30 [parent] => 25 [name] => Overview [uri] => 68 [basename] => news.private.overview.php [child] => ) ) ) [26] => Array ( [id] => 26 [parent] => 23 [name] => Calendar [uri] => 0 [basename] => [child] => Array ( [31] => Array ( [id] => 31 [parent] => 26 [name] => Add [uri] => 69 [basename] => news.event.add.php [child] => ) [32] => Array ( [id] => 32 [parent] => 26 [name] => Overview [uri] => 70 [basename] => news.event.overview.php [child] => ) ) ) ) ) ) 它可以用于删除数组中任何位置的键,但只基于一件事,例如删除“parent”等于“23”的所有键。但是我需要查找并移除(取消设置)所有键,其中“basename”为null,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);
    });

对于PHP<5.3(或者如果在多个位置使用该函数调用
searchAndDestroy
),请命名函数并传递名称,而不是匿名函数。

解决了它!将此函数添加到我的类: private function cleanTree(&$arr){ foreach($arr as $key => &$item) { if(!$item["child"] && empty($item["basename"])){ unset($arr[$key]);

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


要删除根级别和其他任何级别上不必要的元素,只需运行上面的两次

最后他停止了写作:-)你能不能用
var\u export
来代替
print\u r
@来提供数组结构第四部分你需要给鼠标滚轮上油才能走得更快。如果无用的物品下降3级怎么办?
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);
    });
private function cleanTree(&$arr){ foreach($arr as $key => &$item) { if(!$item["child"] && empty($item["basename"])){ unset($arr[$key]);

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