Veo un problema con su solución. Cuando verifica la ID if($id == $record->id)
solo coincidirá con el nivel actual en el árbol. es decir, seleccionar Dell con id=2 no coincidirá con la primera iteración, por lo que su función no pasará al siguiente nivel.
Debe realizar un seguimiento de la ruta al menú seleccionado.
En tu caso. Cuando seleccione Dell, solo verá "Computadora", ¿verdad?
¿Qué tal algo como esto:
...
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));
...