PHP 实现无限级栏目分类读取:基于 CI 框架的树形结构解析

林舟
林舟
发布时间:2026-10-14 | 4人浏览过
原创

在 Web 开发中,实现无限级栏目分类是构建复杂导航菜单和内容管理的核心需求。本文基于经典的 CodeIgniter (CI) 框架场景,解析如何通过数据库设计(id 关联 uid)及 PHP 循环逻辑,将扁平数据转换为具有层级的树形列表。

1. 结果与目标

我们的目标是将存储在数据库中的扁平化栏目数据,渲染为具备父子层级关系的 HTML 列表。例如,当用户访问首页时,系统能自动识别哪些是顶级栏目,哪些是子栏目,并按缩进顺序输出:

  • 我是栏目1(父类)
    • 我是栏目1的子类(子类)
  • 我是栏目2(父类)

2. 准备条件

要实现这一功能,需满足以下数据结构和环境前提:

  1. 数据库表结构:表中至少包含两个关键字段。
    • id:栏目的唯一自增主键(用于定位自身)。
    • uid:上级栏目 ID(Parent ID)。若 uid 为 0 或 NULL,则代表这是顶级栏目。
  2. 数据样例:
id uid 名称
1 0 我是栏目1
2 1 我是栏目1的子类
3 0 我是栏目2

3. 真实操作顺序

第1步:获取所有栏目基础数据

目的:一次性从数据库拉取所需的所有分类数据,避免在循环中进行 N+1 次查询导致的性能问题。

代码逻辑:使用 CodeIgniter 的数据库驱动执行查询,并将结果集转换为对象数组。

复制代码 代码如下:
<?php 
// 假设 $this->db 已正确配置连接
$query = $this->db->query("SELECT * FROM category");
$list = $query->result(); // 获取所有数据到内存
?>

第2步:遍历筛选父级栏目并初始化外层容器

目的:找出所有作为起点的“根节点”(即 uid == 0 的栏目),并为每个根节点创建列表项标签。

动作说明:

  1. 循环遍历上一步获取的 $list 数组。
  2. 判断当前条目的 category_id(对应 uid)是否为 0。
  3. 如果是父级,构建包含链接 <a> 的基础列表标签 <ul> 并开始输出。
<?php 
foreach($list as $v){
    if($v->category_id == 0){ // 判断是否为父栏目
        // 使用 anchor 辅助函数生成带 URL 的文本链接
        $categoryul = anchor("home/content/".$v->id, $v->category_name);
        echo "<ul>".$categoryul."</ul><!-- 此处仅为演示简化结构 -->";
    }
}
?>

第3步:递归/嵌套获取子栏目并补全层级

目的:在识别出父栏目后,立即查询该父栏目下的所有直接子类,并将其包裹在对应的 <li> 中,以维持树形结构的完整性。

重要参数:传入当前父栏目的 id 给子查询方法(如示例中的 Listx->list_id())。

<?php 
// ...接上文
    // 根据父id获取指定的子栏目
    $listx = $this->Listx->list_id($v->id);
    
    // 遍历子栏目列表
    foreach($listx as $vid){
        $category = anchor("home/content/".$vid->id, $vid->category_name);
        echo "<li>".$category."</li>";
    }
?>

4. 完成判断

检查前端页面源代码或浏览器渲染效果。如果输出的 HTML 结构中,子类目被正确地嵌套在父类目的 <ul> 标签内部,且层级缩进符合预期,则证明无限级读取逻辑运行正常。

5. 简要总结

上述 PHP 代码展示了一种基础的无限级分类处理思路:先查总表,再按 uid=0 筛选父级,最后针对每个父级动态查询其子级。虽然简单的 `if` 判断结合嵌套循环能解决两层或多层显示,但在超深层级下,建议使用递归函数或构建树形数组后再渲染,以获得更好的维护性。

以上就是PHP无限级栏目分类读取的详细内容,更多关于PHP无限级分类的代码资料请关注本站其它相关文章!

本站声明

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

Python 相关产品和应用

全部下载

专题列表