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

PHP如何递归获取数组中指定键关联的所有嵌套层级值

原函数存在的问题
  • 递归调用arrayTraverse后未接收返回的新结果集,递归查询到的关联值没有合并到当前的$returndata中,导致只有第一层结果被返回
  • 未做重复节点校验,如果数组存在环形引用(比如A指向B,B又指向A)会触发递归死循环
  • 每次递归遍历全数组效率偏低,可直接用isset($array[$targetKey])快速判断目标键是否存在,无需遍历所有键
正确实现代码
function arrayTraverse($targetKey, $array, &$returndata = [], &$visited = [])
{
    // 已访问过的键或不存在的键直接跳过,避免死循环
    if (isset($visited[$targetKey]) || !isset($array[$targetKey])) {
        return;
    }
    // 标记当前键已访问
    $visited[$targetKey] = true;
    // 遍历当前键对应的所有关联值
    foreach ($array[$targetKey] as $val) {
        $returndata[] = $val;
        // 递归查询当前值作为键对应的关联内容
        arrayTraverse($val, $array, $returndata, $visited);
    }
}

// 调用示例
$sourceArray = [
    22 => [1074, 1926],
    1772 => [1080, 1921],
    1926 => [1772],
    1080 => [1833]
];
$result = [];
arrayTraverse(1926, $sourceArray, $result);
print_r($result);
输出结果
Array
(
    [0] => 1772
    [1] => 1080
    [2] => 1833
    [3] => 1921
)

注:上述实现用引用传参处理结果集和访问标记,所有递归操作都修改同一个变量,无需每次调用合并返回值,逻辑更简洁性能也更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:54:07