PHP如何判断多维数组存在指定键并追加对应数组到新数组
代码存在的核心问题
你的递归逻辑无法生效,是几个明显的编码错误导致的:
- 变量作用域不匹配:函数内直接调用
$array、$another_array属于函数局部作用域,无法读取全局定义的原数组和结果数组,且递归逻辑依赖全局遍历对象会导致层级遍历错乱。 - 递归遍历对象错误:函数已经接收了当前遍历的数组参数
$item,但循环时写的是foreach($array as $key => $item),每次递归都会重新遍历最外层原数组,根本不会进入子层级遍历。 - 状态判断逻辑无效:
var_dump()是直接输出内容的语言结构,没有返回值,用它的执行结果和true做判断永远不成立;同时你的递归函数没有返回匹配状态,上层调用无法感知子层级是否找到目标键。 - 结果追加逻辑混乱:没有按路径层级组装匹配到的分支,随机追加子数组无法得到你要的完整路径结果。
可直接运行的正确实现
递归函数不需要依赖全局结果数组,只需要在找到目标键后逐层向上返回组装好的分支路径即可,逻辑更清晰也不会有作用域问题:
// 原嵌套数组 $array = [ 1 => [], 2 => [], 3 => [ 4 => [ 5 => [ 8 => [] ] ] ] ]; $searchKey = 8; $resultArr = []; /** * 深度递归查找数组内指定键,返回从当前层到目标键的完整分支 * @param array $currentArr 当前遍历的数组层 * @param int|string $searchKey 要查找的目标键 * @return array|false 找到返回完整分支,未找到返回false */ function findKeyByDepth(array $currentArr, $searchKey) { // 当前层直接存在目标键,直接返回当前层数组 if (array_key_exists($searchKey, $currentArr)) { return $currentArr; } // 遍历当前层所有子节点递归查找 foreach ($currentArr as $key => $value) { if (is_array($value)) { $childRes = findKeyByDepth($value, $searchKey); // 子层级找到目标,将当前键和子结果组装后向上返回 if ($childRes !== false) { return [$key => $childRes]; } } } // 所有节点遍历完未找到目标 return false; } // 执行查找,将结果存入目标数组 $findRes = findKeyByDepth($array, $searchKey); if ($findRes !== false) { $resultArr[] = $findRes; }
执行结果
运行后$resultArr的输出结构如下:
array(1) { [0]=> array(1) { [3]=> array(1) { [4]=> array(1) { [5]=> array(1) { [8]=> array(0) {} } } } } }
你给出的预期结果里漏写了父级键
3,实际从根节点到键8的完整路径是3 -> 4 -> 5 -> 8,如果确实需要剔除最外层的键3,只需要在存入结果时取$findRes[3]即可,得到的结构就和你写的预期完全一致。
内容的提问来源于stack exchange,提问作者m hiiii
相关产品推荐
相关产品推荐

