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

如何编写递归函数删除嵌套关联数组的指定键?

嵌套关联数组递归删除指定键的问题解决

我有一个嵌套关联数组,结构如下:

Array ( 
    [test1] => Array ( 
        [test2] => Array ( 
            [test3] => Hello 
        ) 
    ) 
)

需要实现一个函数,传入键名就能删除数组中所有层级的对应元素,比如调用del_key('test2')就可以删除所有名为test2的键。我尝试用递归方式实现,但写的代码有问题,原代码如下:

function del_key($key, array $arr) {
    if (isset($arr[$searchKey])) {
        unset($arr[$searchKey]);
    }
    foreach ($arr as $key => &$param) {
        if (is_array($param)) {
            self::del_key($searchKey, $param);
        }
    }
}

原代码的问题分析

  • 变量名不匹配:函数参数定义的是$key,但代码中却使用了未定义的$searchKey,导致逻辑无法执行
  • 数组传值错误:参数array $arr是值传递,函数内对数组的修改不会影响原数组,需要改为引用传递
  • 变量覆盖:foreach循环中使用$key => &$param,会覆盖函数的$key参数,导致递归时传递错误的键名
  • 递归调用方式错误:如果是普通函数,不能用self::调用,直接调用函数名即可

修正后的代码

function del_key($targetKey, &$arr) {
    // 检查当前层级是否存在目标键,存在则删除
    if (isset($arr[$targetKey])) {
        unset($arr[$targetKey]);
    }
    // 遍历数组,递归处理所有子数组
    foreach ($arr as &$value) {
        if (is_array($value)) {
            del_key($targetKey, $value);
        }
    }
    // 释放引用,避免后续数组操作出现异常
    unset($value);
}

使用示例

// 定义原数组
$myArray = [
    'test1' => [
        'test2' => [
            'test3' => 'Hello'
        ],
        'test2' => 'Another Value' // 如果有多个同名键也会被删除
    ]
];

// 调用函数删除test2键
del_key('test2', $myArray);

// 输出修改后的数组
print_r($myArray);

执行后输出:

Array ( 
    [test1] => Array ( 
    ) 
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:10:55