PHP实现无限级分类的2种方法——父值与左右值1

本文介绍了在PHP中实现无限级分类的两种方法:1) 毗邻目录模式(adjacency list model)通过父值表示节点关系;2) 预排序遍历树算法,利用左右值高效查询树结构。文章详细展示了如何通过数据库表结构和PHP函数来操作这种树状数据,并讨论了各自的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、引言
存储及实现无限级分类有两种常用实现方法:
    1、 毗邻目录模式(adjacency list model)
    2、 预排序遍历树算法(modified preorder tree traversal algorithm)

二、模型
这里我用一个简单食品目录作为我们的示例数据。

我们的数据结构是这样的,以下是代码:

  1. Food
  2. |
  3. |---Fruit
  4. |    |
  5. |    |---Red
  6. |    |    |
  7. |    |    |--Cherry
  8. |    |
  9. |    +---Yellow
  10. |          |
  11. |          +--Banana
  12. |
  13. +---Meat
  14.       |--Beef
  15.       +--Pork

三、实现

1、毗邻目录模式(adjacency list model)——父值
这种模式我们经常用到,很多的教程和书中也介绍过。我们通过给每个节点增加一个属性 parent 来表示这个节点的父节点从而将整个树状结构通过平面的表描述出来。根据这个原则,例子中的数据可以转化成如下的表:
以下是代码:

  1. +-----------------------+
  2. |   parent |    name    |
  3. +-----------------------+
  4. |          |    Food    |
  5. |   Food   |   Fruit    |
  6. |   Fruit  |    Green   |
  7. |   Green  |    Pear    |
  8. |   Fruit  |    Red     |
  9. |   Red    |    Cherry  |
  10. |   Fruit  |    Yellow  |
  11. |   Yellow |    Banana  |
  12. |   Food   |    Meat    |
  13. |   Meat   |    Beef    |
  14. |   Meat   |    Pork    |
  15. +-----------------------+
我们看到 Pear 是Green的一个子节点,Green是Fruit的一个子节点。而根节点'Food'没有父节点。 为了简单地描述这个问题,这个例子中只用了name来表示一个记录。 在实际的数据库中,你需要用数字的id来标示每个节点,数据库的表结构大概应该像这样:id, parent_id, name, descrīption。
有了这样的表我们就可以通过数据库保存整个多级树状结构了。

显示多级树,如果我们需要显示这样的一个多级结构需要递归函数。
以下是代码:

  1. <?php
  2. // $parent is the parent of the children we want to see
  3. // $level is increased when we go deeper into the tree,
  4. //        used to display a nice indented tree
  5. function display_children($parent, $level) {
  6.     // 获得一个 父节点 $parent 的所有子节点
  7.     $result = mysql_query("
  8.         SELECT name
  9.         FROM tree
  10.         WHERE parent = '" . $parent . "'
  11.         ;"
  12.     );
  13.     // 显示每个子节点
  14.     while ($row = mysql_fetch_array($result)) {
  15.         // 缩进显示节点名称
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值