Ich sehe ein Problem mit Ihrer Lösung. Wenn Sie nach der ID suchen if($id == $record->id)
Sie stimmen nur mit der aktuellen Ebene im Baum überein. Das heißt, die Auswahl von Dell mit id =2 stimmt nicht mit der ersten Iteration überein, sodass Ihre Funktion nicht zur nächsten Ebene wechselt.
Sie müssen den Pfad zu Ihrem ausgewählten Menü im Auge behalten.
In Ihrem Fall. Wenn Sie Dell auswählen, sehen Sie nur "Computer", habe ich recht?
Wie wäre es mit so etwas:
...
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));
...