PHP将嵌套foreach遍历树形结构改写为任意深度递归函数
多层嵌套foreach改写动态递归实现
针对树形结构深度动态变化、无法用固定层数foreach遍历的场景,直接使用以下递归逻辑即可,输出结构和原有硬编码逻辑完全一致。
可直接运行的实现代码
$tot_terms = []; // 递归遍历函数 $traverse = function ($nodeList) use (&$tot_terms, &$traverse) { foreach ($nodeList as $node) { // 按depth分组收集当前节点tid $tot_terms[$node->depth][] = $node->tid; // 存在子节点则递归进入下一层处理 if (!empty($node->children)) { $traverse($node->children); } } }; // 传入根层级树结构启动遍历 $traverse($tree);
逻辑说明
- 采用引用传递
&$tot_terms和递归函数自身引用,保证所有层级遍历的结果都能写入同一个结果数组,不存在作用域导致的数据丢失问题 - 无需预先判断树的最大深度,遍历到任意节点时自动处理其下所有子节点,完全替代原有写死6层的嵌套foreach逻辑
- 兼容输入为对象元素数组的格式,最终输出结构和给出的期望分组数组完全匹配
常见实现失败排查点
- 递归传递结果数组时未加引用标记,导致子层级的收集结果无法同步到外层
- 初始传入遍历的参数错误,误将第一层节点的子节点作为根入参,漏掉第一层节点数据
- 未判断
children字段非空就执行递归,传入非数组值引发遍历报错
内容的提问来源于stack exchange,提问作者Dinesh Chandra
相关产品推荐
相关产品推荐

