ok
quello che fai tu direi che è per convertire un albero in una lista 
Che è quello che fò pure io dopo essermi costruito l'albero
codice:
public function BuildTree($Categories)
{
// Inizializza l'albero
$categoryTree = array();
// Come prima cosa inserisce tutte le categorie nella struttura che conterrà
// l'albero senza però associarli
while(list($key, $value) = each($Categories))
{
// Inzializza il nodo dell'albero
$categoryNode = new stdClass();
$categoryNode->Element = $value;
$categoryNode->Children = array();
// Aggiunge il nodo all'albero
$categoryTree[$key] = $categoryNode;
}
// Resetta le categorie
reset($Categories);
questo primo while si occupa di prendere un elenco di categorie già estratte dal database (poi questo metodo lo rinomino in InternalBuildTree e ne creo un secondo al quale se non vien passato nulla effettua lui l'estrazione dei dati e salta la prima fase in modo da mantenere la flessibilità e in modo da potermi muovere come mi serve senza perderci)
Siccome lavoro con gli oggetti e mi interessa crearmi un albero devo fare questo rigiro qua
codice:
// Cicla le categorie
while(list($key, $categoryNode) = each($categoryTree))
{
// Verifica se l'elemento va inserito in un nodo e se questo esiste
if (($isChildElement = ($categoryNode->Element->GetParentID() !== 0)) &&
isset($categoryTree[$categoryNode->Element->GetParentID()]) === true)
{
$categoryTree[$categoryNode->Element->GetParentID()]->
Children[$categoryNode->Element->GetID()] = $categoryNode;
}
// L'if precedente non si è verificato quindi controlla se l'elemento
// non è un parent e quindi il ciclo non si deve interrompere
else if($isChildElement === true)
{
// Imposta lo switch
$foundedChildCategories = true;
}
}
// Resetta le categorie
reset($categoryTree);
questo secondo while associa i child con i parent usando i riferimenti
[code]
// Elimina tutti gli elementi che non appartengono alla root dall'albero
while(list($key, $categoryNode) = each($categoryTree))
{
// Verifica se appartiene alla root
if ($categoryNode->Element->GetParentID() != 0)
{
// Elimina l'elemento
unset($categoryTree[$key]);
}
}
// Resetta le categorie
reset($categoryTree);
[code]
per finire quest'ultimo elimina dall'elemento root dell'albero tutti gli elementi che non vi appartengono ... tanto sono stati settati come figli dei vari elementi e quindi stanno tutti li dentro
codice:
// Restituisce l'elenco
return $categoryTree;
}
secondo voi posso ottimizzare/migliorare in qualche punto? Inoltre come potrei ottenere l'ordinamento? forse non mi conviene farlo qua ma dopo quando effettuo la visualizzazione e quindi lo riconverto in lista 
Alternativamente, avete qualche strada alternativa?