Я использую примерно такой алгоритм. Считываю простым запросом из БД (два поля) всю табличку и создаю дерево со всеми подуровнями. Вроде легко внести изменения в алгоритм, чтоб налету вставлять top_guid или затем пробежаться по массиву и добавить.
/*
* make a tree array based on sql query
*/
function buildtree()
{
$refs = array();
$list = array();
$nodes = (Получить поля guid и parent_guid из всей таблички);
foreach ($nodes as $data) {
$thisref = &$refs[$data['guid']];
$thisref['parent_guid'] = $data['parent_guid'];
if ($data['parent_guid'] == null) {
$list[$data['guid']] = &$thisref;
} else {
$refs[$data['parent_guid']]['children'][$data['guid']] = &$thisref;
}
}
return $list;
}