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?