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

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

本文分享一段基于 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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。