Vedo un problema con la tua soluzione. Quando controlli l'ID if($id == $record->id)
corrisponderai solo al livello corrente nell'albero. ad es. la selezione di Dell con id=2 non corrisponderà alla prima iterazione, quindi la tua funzione non passerà al livello successivo.
Devi tenere traccia del percorso del menu selezionato.
Nel tuo caso. Quando selezioni Dell visualizzerai solo "Computer", vero?
Che ne dici di qualcosa del genere:
...
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));
...