如何递归过滤PHP多维数组?移除Url为"MUST REMOVED"的项
多维PHP菜单数组过滤:移除指定Url的项
需要处理一个多层级的PHP菜单数组,移除所有Url字段值等于"MUST REMOVED"的项,无论这些项处于数组的哪一层级。
原数组代码
$menu = array( "System" => array( "VisibleName" => "System", "Children" => array( "Access" => array( "VisibleName" => "Access", "Url"=>"/sth", "Children" => array( "Groups" => array( "VisibleName" => "Groups", "Url" => "/Groups" ), "LockoutTable" => array( "VisibleName" => "LockoutTable", "Url" => "MUST REMOVED" ), "Password" => array( "VisibleName" => "Password", "Url" => "MUST REMOVED" ), ), "users" => array( "VisibleName" => "users", "Url"=>"MUST REMOVED", "Children" => array() ), "roles" => array( "VisibleName" => "Access", "Url"=>"/roles", "Children" => array() ) ), ) ), );
未完成的过滤逻辑
$filtered_menu = array(); foreach ($menu as $level_one_k => $level_one_v) { $level_two_filtered=array(); foreach($level_one_v as $level_two_k=>$level_two_v){ // 不知道怎么继续了 // 需要过滤所有Url == "MUST REMOVED"的项 } $filtered_menu[$level_one_k]=$level_two_filtered; }
期望过滤结果
$menu = array( "System" => array( "VisibleName" => "System", "Children" => array( "Access" => array( "VisibleName" => "Access", "Url"=>"/sth", "Children" => array( "Groups" => array( "VisibleName" => "Groups", "Url" => "/Groups" ), ), "roles" => array( "VisibleName" => "Access", "Url"=>"/roles", "Children" => array() ) ), ) ), );
解决方案:递归过滤函数
多层级数组用嵌套循环会非常繁琐,推荐用递归函数自动遍历所有层级:
function filterMenuItems($items) { $filtered = array(); foreach ($items as $key => $item) { // 如果当前项是数组,先递归处理它的Children子数组 if (is_array($item)) { if (isset($item['Children']) && is_array($item['Children'])) { $item['Children'] = filterMenuItems($item['Children']); } // 仅保留Url不是"MUST REMOVED"的项 if (!isset($item['Url']) || $item['Url'] !== "MUST REMOVED") { $filtered[$key] = $item; } } else { // 非数组字段直接保留 $filtered[$key] = $item; } } return $filtered; } // 调用函数处理原数组 $filtered_menu = filterMenuItems($menu); // 打印结果验证 print_r($filtered_menu);
逻辑说明
- 递归遍历数组中每个元素
- 遇到带
Children的子数组时,先递归处理子数组内容 - 检查当前项的
Url字段:不存在或不等于"MUST REMOVED"的项才保留 - 最终返回完全过滤后的数组
内容的提问来源于stack exchange,提问作者morteza mortezaie
相关产品推荐
相关产品推荐

