PHP 递归实现无限级分类树形菜单代码示例

桃夭
桃夭
发布时间:2026-10-14 | 5人浏览过
原创

本文分享一段基于 PHP 递归实现的树形菜单代码,主要用于解决电子商务网站中商品分类等无限级层级的显示问题。代码通过 SQL 查询获取分类数据,利用静态数组记录当前路径以计算层级深度,最终返回带有缩进和级别信息的二维数组。

核心实现逻辑

实现树形菜单的关键在于两点:一是按层级顺序扁平化输出分类列表,二是准确标记每个节点的缩进空格和所属层级。本方案采用递归函数 procCategory,在每次查询父节点下的一级子节点后,递归调用自身处理更深层次的数据,从而将嵌套结构转换为易于模板渲染的线性列表。

第1步:定义递归函数与初始化参数

首先创建一个类方法,接收站点ID($sid)和当前父级ID($pid)。声明一个静态数组 $arr 用于在整个递归过程中保存当前正在处理的父节点 ID 路径,这是计算层级的关键依据。

public function procCategory($sid, $pid) {
    $return = array();
    $key = 0;
    static $arr = array(); // 分类级别参考数组,记录当前路径
    
    // 构造SQL查询当前层级下的所有直接子节点
    $sql = "select cid,pcid,name from shop_goods_catalog where sid='{$sid}' and pcid = '{$pid}'";
    $result = $this->__db->query($sql);

第2步:遍历结果集并计算层级

使用 while 循环遍历数据库返回的每一行数据。如果当前节点的父级 ID 为 0(顶级分类),则重置路径数组。接着将当前子节点的 ID 加入路径数组,并根据其在数组中的位置(索引)确定缩进空格的次数。

while($row=$this->__db->fetchArray($result)){
    $nbsp = '';
    if($row['pcid']==0){
        $arr = array();
    }
    $arr[] = $row['pcid'];
    
    // 只有非顶级分类才需要添加树形缩进
    if($row['pcid']>0){
        // 查找当前ID在路径数组中的位置作为层级键
        $key = array_search($row['pcid'], $arr);
        
        // 根据层级数填充空格
for($i=0;$i<$key;$i++){ $nbsp .= '&nbsp;&nbsp;'; } // 更新路径:若当前ID在之前已出现(分支结束回溯),则截断数组至当前位置 if(count($arr)>1 && count(array_keys($arr,$row['pcid']))>1){ $arr = array_slice($arr,0,$key+1); } }

第3步:格式化输出并递归子节点

将生成的缩进字符串拼接到分类名称前,并记录当前层级级别供前端样式控制。随后,以当前节点的 ID 作为新的父级 ID 再次调用递归函数,获取其子分类列表,并使用 array_merge 合并到返回结果中。

    $row['name'] = $nbsp . $row['name'];
    $row['level'] = $key; // 分类级别,0为顶级,1为二级,依此类推
    $return[] = $row;
    
    // 递归获取子分类
    $r = $this->procCategory($sid, $row['cid']);
    $return = array_merge($return, $r);
}
    return $return;

性能评估与注意事项

上述代码能够正确构建简单的树形结构,适合数据量较小的场景。然而,由于每一层都需要发起一次数据库查询(N+1 查询问题),当分类层级很深或总数庞大时,递归效率会显著降低。在生产环境中,如果注重程序执行效率,建议先一次性查询出所有相关分类数据,然后在内存中使用 PHP 进行层级关联处理,或者对数据库查询进行优化合并。

总结

以上就是基于 PHP 递归实现树形菜单的详细内容,更多关于 PHP 无限级分类与数据库优化的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表