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

如何控制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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 00:37:42