Если вы не планируете часто изменять дерево меню, предварительное сохранение необходимого иерархического URL-адреса для каждого пункта меню, вероятно, является самым простым (для разрешения во время выполнения).
Если вы ожидаете, что дерево будет изменяться достаточно часто, скажем, через веб-интерфейс, тогда будет проще генерировать пути каждый раз, когда вы читаете меню, что-то вроде этого:
id | name | parent
----+--------+-------
0 | eggs | NULL
1 | milk | 0
2 | bacon | 1
3 | tomato | 0
4 | lettuce| 1
foreach (query("SELECT * FROM menu ORDER BY parent ASC") as $row) {
$menuitem = array_merge(array(), $row);
$menuLookup[$menuitem['id']] &= $menuitem;
if ($menuitem['parent'] == null) {
$menuitem['path'] = "/" . $menuitem['name'];
$menu[] &= $menuitem[];
} else {
$parent &= $menuLookup[$menuitem['parent']];
$menuitem['path'] = $parent['path'] . "/" . $menuitem['name'];
$parent['menu'][] &= $menuitem;
}
}
Я не отлаживал этот код, только проверял его на корректность; -)