okquello che fai tu direi che è per convertire un albero in una lista
Che è quello che fò pure io dopo essermi costruito l'albero
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)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);
Siccome lavoro con gli oggetti e mi interessa crearmi un albero devo fare questo rigiro qua
questo secondo while associa i child con i parent usando i riferimenticodice:// 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);
[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
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 listacodice:// Restituisce l'elenco return $categoryTree; }
Alternativamente, avete qualche strada alternativa?

quello che fai tu direi che è per convertire un albero in una lista 

Rispondi quotando