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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:21:24