这里我建立一个树状菜单。可以通过其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);
?>
例如 如果单击计算机,则
如果戴尔点击了
答案 0 :(得分:1)
我发现您的解决方案存在一个问题。检查ID if($id == $record->id)
时,您只会匹配树中的当前级别。即选择ID为2的Dell与第一次迭代不匹配,因此您的函数不会遍历到下一级别。
您需要跟踪所选菜单的路径。
在你的情况下。当您选择戴尔时,您只会选择“计算机”,我是对的吗?
这样的事情怎么样:
...
function rederTreeById($records, $path) {
echo '<ul>';
foreach($records as $record) {
if(in_array($record->id, $path)) {
echo '<li>'.$record->title;
if(!empty($record->childs)) {
rederTreeById($record->childs, $path);
}
echo '</li>';
} else {
echo '<li>'.$record->title.'</li>';
}
}
echo '</ul>';
}
function getPath($id) {
$path = array();
$current=$id;
$path[] = 1
while(!is_null($categories[$current]->parent_id)) {
$current=$categories[$current]->parent_id
$path[] = $current;
}
return $path;
}
$selectedId = 1;
rederTreeById($rootCategories, getPath($selectedId));
...