一、引言
存储及实现无限级分类有两种常用实现方法:
1、 毗邻目录模式(adjacency list model)
2、 预排序遍历树算法(modified preorder tree traversal algorithm)
二、模型
这里我用一个简单食品目录作为我们的示例数据。
我们看到 Pear 是Green的一个子节点,Green是Fruit的一个子节点。而根节点'Food'没有父节点。 为了简单地描述这个问题,这个例子中只用了name来表示一个记录。 在实际的数据库中,你需要用数字的id来标示每个节点,数据库的表结构大概应该像这样:id, parent_id, name, descrīption。
有了这样的表我们就可以通过数据库保存整个多级树状结构了。
显示多级树,如果我们需要显示这样的一个多级结构需要递归函数。
以下是代码:
存储及实现无限级分类有两种常用实现方法:
1、 毗邻目录模式(adjacency list model)
2、 预排序遍历树算法(modified preorder tree traversal algorithm)
二、模型
这里我用一个简单食品目录作为我们的示例数据。
我们的数据结构是这样的,以下是代码:
- Food
- |
- |---Fruit
- | |
- | |---Red
- | | |
- | | |--Cherry
- | |
- | +---Yellow
- | |
- | +--Banana
- |
- +---Meat
- |--Beef
- +--Pork
三、实现
1、毗邻目录模式(adjacency list model)——父值
这种模式我们经常用到,很多的教程和书中也介绍过。我们通过给每个节点增加一个属性 parent 来表示这个节点的父节点从而将整个树状结构通过平面的表描述出来。根据这个原则,例子中的数据可以转化成如下的表:
以下是代码:
- +-----------------------+
- | parent | name |
- +-----------------------+
- | | Food |
- | Food | Fruit |
- | Fruit | Green |
- | Green | Pear |
- | Fruit | Red |
- | Red | Cherry |
- | Fruit | Yellow |
- | Yellow | Banana |
- | Food | Meat |
- | Meat | Beef |
- | Meat | Pork |
- +-----------------------+
有了这样的表我们就可以通过数据库保存整个多级树状结构了。
显示多级树,如果我们需要显示这样的一个多级结构需要递归函数。
以下是代码:
- <?php
- // $parent is the parent of the children we want to see
- // $level is increased when we go deeper into the tree,
- // used to display a nice indented tree
- function display_children($parent, $level) {
- // 获得一个 父节点 $parent 的所有子节点
- $result = mysql_query("
- SELECT name
- FROM tree
- WHERE parent = '" . $parent . "'
- ;"
- );
- // 显示每个子节点
- while ($row = mysql_fetch_array($result)) {
- // 缩进显示节点名称