Виждам един проблем с вашето решение. Когато проверявате за 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));
...