Отобразить дерево меню выбранного родительского

Здесь im строит дерево меню. Доступ к категории осуществляется по ее идентификатору и отображаемому ребенку. моя функция отлично работает для двухуровневого меню, но не может генерировать третий уровень. Меню третьего уровня должно отображаться только в том случае, если щелкнул идентификатор элемента второго уровня. Мне нужна эта функция для отслеживания пути к узлу. Это, если указан идентификатор третьего уровня, а дерево должно быть расширено до третьего уровня. т.е. родительский элемент дочернего элемента, и если этот родитель тоже имеет родителя. Таблица 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); ?> 

Например, если щелкнуть Компьютеры затем

  • компьютер
    • Dell
    • HP

если Dell нажал

  • компьютер
    • Dell
      • Ноутбуки
      • Настольные компьютеры
    • HP

Я вижу одну проблему с вашим решением. Когда вы проверяете ID, if($id == $record->id) вы будете соответствовать текущему уровню в дереве. т.е. выбор Dell с 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)); ...