本篇文章是对php左右值无限分类的实现算法进行了详细的分析介绍,需要的朋友参考下
一、引言
产品分类,香港服务器,多级的树状结构的论坛,邮件列表等许多地方我们都会遇到这样的问题:如何存储多级结构的数据?在PHP的应用中,提供后台数据存储的通常是关系型数据库,它能够保存大量的数据,提供高效的数据检索和更新服务。然而关系型数据的基本形式是纵横交错的表,是一个平面的结构,如果要将多级树状结构存储在关系型数据库里就需要进行合理的翻译工作。接下来我会将自己的所见所闻和一些实用的经验和大家探讨一下:
层级结构的数据保存在平面的数据库中基本上有两种常用设计方法:
* 毗邻目录模式(adjacency list model)
* 预排序遍历树算法(modified preorder tree traversal algorithm)
我不是计算机专业的,也没有学过什么数据结构的东西,所以这两个名字都是我自己按照字面的意思翻的,如果说错了还请多多指教。这两个东西听着好像很吓人,其实非常容易理解。
二、模型
这里我用一个简单食品目录作为我们的示例数据。
我们的数据结构是这样的,以下是代码:
复制代码 代码如下:
Food
|---Fruit
| |---Red
| | |--Cherry
| +---Yellow
|
+--Banana
+---Meat
|--Beef
+--Pork
复制代码 代码如下:
Food : 食物
Fruit : 水果
Red : 红色
Cherry: 樱桃
Yellow: 黄色
Banana: 香蕉
Meat : 肉类
Beef : 牛肉
Pork : 猪肉
复制代码 代码如下:
+-----------------------+
| parent | name |
+-----------------------+
|
| Food |
| Food | Fruit |
| Fruit | Green |
| Green | Pear |
| Fruit | Red
|
| Red | Cherry |
| Fruit | Yellow |
| Yellow | Banana |
| Food | Meat |
| Meat | Beef |
| Meat | Pork |
+-----------------------+
复制代码 代码如下:
// $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)) {
// 缩进显示节点名称
echo str_repeat(' ', $level) . $row['name'] . "\n";
//再次调用这个函数显示子节点的子节点
display_children($row['name'], $level+1);
}
}
?>
复制代码 代码如下:
Food
Fruit
Red
Cherry
Yellow
Banana
Meat
Beef
Pork
复制代码 代码如下:
// $node 是那个最深的节点
function get_path($node) {
// 查询这个节点的父节点
$result = mysql_query("
SELECT parent
FROM tree
WHERE name = '" . $node ."'
;"
);
$row = mysql_fetch_array($result);
// 用一个数组保存路径
$path = array();
// 如果不是根节点则继续向上查询
// (根节点没有父节点)
if ($row['parent'] != '') {
// the last part of the path to $node, is the name
// of the parent of $node
$path[] = $row['parent'];
// we should add the path to the parent of this node
// to the path
$path = array_merge(get_path($row['parent']), $path);
}
// return the path
return $path;
}
?>;
复制代码 代码如下:
Array (
[0] => Food
[1] => Fruit
[2] => Red
)
复制代码 代码如下: