如何编写递归函数删除嵌套关联数组的指定键?
嵌套关联数组递归删除指定键的问题解决
我有一个嵌套关联数组,结构如下:
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
相关产品推荐
相关产品推荐

