Функция преобразует одномерный Adjacency List в многомерный вложенный массив не используя рекурсию.
function makeTree ($list)
{
foreach ($list as $id => $item)
{
if ( $item->parent > 0 )
{
$list[$item->parent]->childs[$id] = $item;
$list[$id] = &$list[$item->parent]->childs[$id];
}
}
foreach ($list as $id => $item)
{
if ( $item->parent > 0 )
unset($list[$id]);
}
return $list;
}