V PHP sice nedělám, ale zkusil bych něco takového:
function build_menu($rows,$parent=0,$prefix='')
{
$result = "<ul>";
foreach ($rows as $row)
{
if ($row['parent_id'] == $parent){
$result.= "<li>{$prefix} {$row['title']}";
if (has_children($rows,$row['id']))
$result.= build_menu($rows,$row['id'], $prefix.$row['title'].' ');
$result.= "</li>";
}
}
$result.= "</ul>";
return $result;
}