Здесь я строю древовидное меню. Доступ к категории осуществляется по ее идентификатору и дочернему элементу
Моя функция отлично работает для двухуровневого меню, но не может создать третий уровень. Меню третьего уровня должно отображаться только в том случае, если щелкнул идентификатор элемента второго уровня. Мне нужна эта функция, чтобы отслеживать путь к узлу тоже. Что если указан идентификатор третьего уровня, то дерево должно быть расширено до третьего уровня. то есть родительский ребенок, и если у этого родителя тоже есть родитель.
MySQL Table
+-------+-----------+------------+
| 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);
?>
Например
если нажал Компьютеры то
если Dell нажал, то
- Компьютер
- Dell
- Ноутбуки
- 1029 * Desktops *
- HP