如何控制PHP无限级分类的深度?附代码与需求示例
解决分类树形结构的深度控制问题
嘿,我来帮你搞定这个分类深度控制的需求!你的quote_make_tree函数已经能生成完整的树形结构了,现在要加上$deep参数限制层级,有两种靠谱的实现思路,我都给你整理出来:
思路一:生成树形结构时直接控制深度(推荐)
这种方法不用生成全量数据再删除,效率更高。我们可以在构建节点的时候,跟踪当前节点的层级,当层级达到$deep时,就不再为该节点添加子节点。
修改后的函数代码如下:
function quote_make_tree($list, $deep = 1, $root = 0) { $tree = []; // 先把列表转成以id为键的数组,方便快速查找父节点 $packData = []; foreach ($list as $row) { $packData[$row['id']] = $row; } // 递归处理节点,跟踪当前深度 function buildNode(&$node, $currentDeep, $maxDeep, &$packData) { // 如果当前深度已经达到最大限制,直接返回,不处理子节点 if ($currentDeep >= $maxDeep) { return; } // 查找当前节点的子节点 foreach ($packData as $key => $val) { if ($val['parent_id'] == $node['id']) { $node['children'][] = &$packData[$key]; // 递归处理子节点,深度+1 buildNode($node['children'][count($node['children'])-1], $currentDeep + 1, $maxDeep, $packData); } } } // 处理根节点(parent_id=0的节点) foreach ($packData as $key => $val) { if ($val['parent_id'] == $root) { $tree[] = &$packData[$key]; // 根节点的深度是1,开始递归处理子节点 buildNode($tree[count($tree)-1], 1, $deep, $packData); } } return $tree; }
调用示例:
- 获取1级分类(仅parent_id=0):
quote_make_tree($list, 1) - 获取1-2级分类:
quote_make_tree($list, 2) - 获取1-3级分类:
quote_make_tree($list, 3)
思路二:生成全树后再修剪到指定深度
如果你更倾向于先生成完整树形,再删除超出深度的节点,可以写一个辅助修剪函数:
// 原函数保持不变,生成完整树形 function quote_make_tree_full($list, $root = 0) { $tree = $packData = []; foreach ($list as $row) { $packData[$row['id']] = $row; } foreach ($packData as $key => $val) { if ($val['parent_id'] == $root) { $tree[] = &$packData[$key]; } else { $packData[$val['parent_id']]['children'][] = &$packData[$key]; } } return $tree; } // 修剪树形到指定深度 function trim_tree_depth(&$tree, $currentDeep = 1, $maxDeep = 1) { foreach ($tree as &$node) { if ($currentDeep >= $maxDeep) { // 达到最大深度,删除子节点 unset($node['children']); continue; } // 如果有子节点,递归修剪 if (isset($node['children'])) { trim_tree_depth($node['children'], $currentDeep + 1, $maxDeep); } } }
使用方式:
// 生成完整树形 $fullTree = quote_make_tree_full($list); // 修剪到2级深度 trim_tree_depth($fullTree, 1, 2); // $fullTree现在就是1-2级的分类结构
两种方法都能实现你的需求,第一种在生成时就控制层级,避免了不必要的节点创建,性能更好;第二种逻辑更直观,适合快速调试。你可以根据自己的场景选择~
内容的提问来源于stack exchange,提问作者DomainRocker
相关产品推荐
相关产品推荐

