You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何递归过滤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);

逻辑说明

  1. 递归遍历数组中每个元素
  2. 遇到带Children的子数组时,先递归处理子数组内容
  3. 检查当前项的Url字段:不存在或不等于"MUST REMOVED"的项才保留
  4. 最终返回完全过滤后的数组

内容的提问来源于stack exchange,提问作者morteza mortezaie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:23:34