PHP中根据键值从无限嵌套多维数组取值的问题
解决PHP无限嵌套数组的递归查找问题
我来帮你搞定这个递归函数的问题!你的思路完全正确——用递归处理无限嵌套的数组确实比多层循环灵活得多,但原函数的逻辑有个关键漏洞,导致它找不到深层的目标值。
原函数的问题分析
原函数的核心问题出在foreach循环的else分支上:它在第一次遇到不匹配的$key时,直接返回递归调用的结果,这会强制终止循环,根本没机会检查当前层级的其他元素(比如关键的children字段)。
举个例子,当你查找109时:
- 函数先遍历最外层数组的
16键,不匹配就直接递归到16对应的子数组 - 接着遍历子数组的第一个键
categories_id,不匹配又递归到它的值16(不是数组/可遍历对象,返回null) - 整个函数直接返回
null,完全没走到children分支去查找目标109
修正后的递归函数
function findParentNameFromCategory($obj, $search) { // 先判断当前结构是否可遍历 if (!is_array($obj) && !$obj instanceof Traversable) { return null; } foreach ($obj as $key => $value) { // 检查当前键是否是目标值 if ($key == $search) { // 用null合并运算符避免无parent_name字段时报错 return $value['parent_name'] ?? null; } // 递归查找当前值的深层结构 $result = findParentNameFromCategory($value, $search); // 递归找到结果则直接返回,否则继续遍历当前层级的其他元素 if ($result !== null) { return $result; } } // 遍历完所有元素仍未找到,返回null return null; }
关键改进点
- 移除强制终止的else分支:改为遍历每个元素后都尝试递归,只有当递归返回有效结果时才终止,确保当前层级的所有元素都会被检查
- 增加容错处理:用
?? null避免目标元素没有parent_name字段时触发PHP警告 - 明确返回值语义:未找到时返回
null,方便调用方判断结果是否存在
测试验证
现在执行以下代码就能正常获取到目标值了:
$test = findParentNameFromCategory($menu, 109); echo $test; // 输出:Recorders - Security - 4CH NVR
内容的提问来源于stack exchange,提问作者poNgz0r
相关产品推荐
相关产品推荐

