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

PHP中无需多层foreach提取嵌套JSON数组的所有id值

这问题太常见了!处理这种层级不固定的嵌套JSON结构,完全不用纠结多层foreach,递归或者迭代式的遍历方法才是王道——不管后续层级扩展到6层还是10层,代码都不用改。下面给你两种实用的实现思路:

方法一:递归遍历(代码简洁易读)

递归的思路很直接:从根节点开始,只要当前节点有id就收集,然后如果有followup子节点,就递归处理这个子节点。这种写法代码量少,逻辑清晰,适合层级不是特别深的场景。

以JavaScript为例:

const data = { "1": { "name": "test", "followup": { "1": { "id": "98", "followup": { "1": { "id": "93", "followup": { "1": { "id": "174" } } } } } } };

function extractAllIds(node) {
    const ids = [];
    // 定义内部遍历函数
    function traverse(current) {
        // 收集当前节点的id(如果存在)
        if (current.id) {
            ids.push(current.id);
        }
        // 检查是否有followup子节点,有的话递归处理
        if (current.followup && current.followup["1"]) {
            traverse(current.followup["1"]);
        }
    }
    // 从根节点的"1"对应的对象开始遍历
    traverse(node["1"]);
    return ids;
}

// 调用示例
const allIds = extractAllIds(data);
console.log(allIds); // 输出: ["98", "93", "174"]
方法二:迭代式广度优先遍历(避免深层级栈溢出)

如果后续层级可能非常深(比如几十层),递归可能会触发栈溢出错误。这时候用迭代的广度优先遍历(借助队列)更安全,逻辑也很清晰:把需要处理的节点放进队列,逐个取出处理,同时把子节点加入队列,直到队列为空。

同样以JavaScript为例:

const data = { "1": { "name": "test", "followup": { "1": { "id": "98", "followup": { "1": { "id": "93", "followup": { "1": { "id": "174" } } } } } } };

function extractAllIdsIterative(node) {
    const ids = [];
    // 初始化队列,放入根节点的"1"对象
    const queue = [node["1"]];

    while (queue.length > 0) {
        // 取出队列的第一个节点
        const current = queue.shift();
        // 收集id
        if (current.id) {
            ids.push(current.id);
        }
        // 如果有followup子节点,加入队列等待处理
        if (current.followup && current.followup["1"]) {
            queue.push(current.followup["1"]);
        }
    }
    return ids;
}

// 调用示例
const allIds = extractAllIdsIterative(data);
console.log(allIds); // 输出: ["98", "93", "174"]
额外扩展:如果followup包含多个子节点

如果后续你的followup里不是固定只有"1"这一个键,而是有多个子节点,可以把代码里的current.followup["1"]改成遍历followup的所有值,比如:

// 递归版调整
if (current.followup) {
    Object.values(current.followup).forEach(child => traverse(child));
}

// 迭代版调整
if (current.followup) {
    Object.values(current.followup).forEach(child => queue.push(child));
}

这样不管followup里有多少个子节点,都能全部遍历到。

内容的提问来源于stack exchange,提问作者Raghul Rajendran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:46:47