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
相关产品推荐
相关产品推荐

