【发布时间】:2012-03-21 04:54:28
【问题描述】:
我在这里建立一个树形菜单。类别通过其 id 访问并显示其子项。 我的功能适用于两级菜单,但无法生成第三级。仅当单击第二级项目的 id 时才应显示第三级菜单。我也需要这个函数来跟踪节点的路径。如果给出第三级 id,则树应该扩展到第三级。即孩子的父母,如果该父母也有父母。 mySQL 表
+-------+-----------+------------+
| id | title | parent_id |
+-------+-----------+------------+
| 1 | Computers | NULL |
+-------+-----------+------------+
| 2 | Dell | 1 |
+-------+-----------+------------+
| 3 | Laptops | 2 |
+-------+-----------+------------+
| 4 | Desktops | 2 |
+-------+-----------+------------+
| 5 | HP | 1 |
+-------+-----------+------------+
PHP 代码
<?php
$sql = "SELECT * FROM category";
$statement= $db->prepare($sql);
$statement->execute();
$categories = array();
$rootCategories = array();
while ( $row = $statement->fetchObject() ) {
$row->childs = array();
$categories[$row->id] = $row;
if(empty($row->parent_id)) {
$rootCategories[$row->id] = $categories[$row->id];
} else {
$categories[$row->parent_id]->childs[] = $categories[$row->id];
}
}
function rederTreeById($records, $id=false) {
echo '<ul>';
foreach($records as $record) {
if($id == $record->id) {
echo '<li>'.$record->title;
if(!empty($record->childs)) {
rederTreeById($record->childs);
}
echo '</li>';
} else {
echo '<li>'.$record->title.'</li>';
}
}
echo '</ul>';
}
rederTreeById($rootCategories, 1);
?>
例如 如果点击计算机则
- 电脑
- 戴尔
- 惠普
如果戴尔点击了那么
- 电脑
- 戴尔
- 笔记本电脑
- 台式机
- 惠普
- 戴尔
【问题讨论】:
-
我注意到您有 2 行 $row->id = 4。
-
能否请您提一下我提到 $row->=4 的两行在哪里?
-
添加两个表也不是多级的解决方案。
-
在这种情况下,我不同意@joakimdahlstrom 的观点,因为当你不知道你的结构可以有多深时,将整棵树放在一张桌子上可以让它非常灵活。
-
@Bjørne Malmanger,完全正确,我没有很好地阅读这篇文章。我将删除我的第一条评论。