Newsgroup: it.comp.www.php
Titolo: X setec, Alberi

Ho scritto una semplice funzione di inserimento di un nodo in un albero 
che abbia la struttura da te proposta in questa immagine:
http://digilander.libero.it/setecastronomy/nodes.gif
Per semplicità ho assunto che il nuovo nodo inserito sia sempre 
"l'ultimo" figlio, cioè quello più a destra.
Ti và di dargli una occhiata ?
ecco il codice:
function insertNode($IDParent,$nodeName)
  {
   $db=db_connect(); // mia connesione al db
   $result=mysql_query("select * from albero where ID=".$IDParent);
   /* trovo il padre */
   $ParentNode=mysql_fetch_array($result);
   /* e lo memorizzo in $ParentNode */
   $result=mysql_query("select max(RightCnt) from albero where 
IDParent=".$ParentNode['ID']);
   $Bro_Rgt_Cnt=mysql_fetch_row($result);
   /* Trovo il massimo RightCnt tra i fratelli (se esistono)*/
   if (isset($Bro_Rgt_Cnt[0])) $LeftCnt=$Bro_Rgt_Cnt[0]+1;
   /* se esiste allora LeftCnt del nuovo nodo è quello del fratello più 
a destra +1 */
   else $LeftCnt=$ParentNode['LeftCnt']+1;
   /* se non esiste allora è il primo figlio e il suo LeftCnt è uguale a 
quello del padre +1 */
   $RightCnt=$LeftCnt+1;
   $Level=$ParentNode['Level']+1;
   $result=mysql_query("update albero set RightCnt=RightCnt+2 where 
RightCnt>=".$LeftCnt);
   /* Fase di aggiornamento dell'albero: aggiorno tutti i RightCnt 
maggiori del LeftCnt del nodo che voglio inserire incrementandoli di 2*/
   $result=mysql_query("update albero set LeftCnt=LeftCnt+2 where 
LeftCnt>=".$LeftCnt);
   /* Fase di aggiornamento dell'albero: aggiorno tutti i LeftCnt 
maggiori del LeftCnt del nodo che voglio inserire incrementandoli di 2*/
   $result=mysql_query("insert into albero values 
('',".$IDParent.",".$Level.",".$LeftCnt.",".$RightCnt.")");
   mysql_close($db);
  }
Ho tralasciato per ora eventuali eccezioni se si vuole inserire un nodo 
e il padre non esiste.
La cancellazione mi sembra un pelino più complessa.
ciao
Alesi_27

 La cancellazione mi sembra un pelino più complessa.
E' solo una impressione, ho fatto una breve analisi e sono riuscito a
definire tutte le operazioni (INSERIMENTO, ELIMINAZIONE, SPOSTAMENTO)
possibili, non sono complesse da eseguire, l'unico problema potrebbe
derivare dalla necessita' di effettuare transazioni.
Sto implementando una classe che gestisca il tutto, ma al momento sono
subissato di lavoro.
-- 
I'am what I'am, I do what I can

 
con fetch_array puoi utilizzare il risultato sia in maniera associativa 
che per indice numerico.
Però effettivamente visto che lo uso solo come associativo ci starebbe 
meglio fetch_assoc.
Anche io volevo scrivere una classe per gestire le categorie, un 
problema che mi è sempre stato indigesto e che fino a quando non ho 
visto il tuo "alberello" non avevo mai saputo risolvere efficacemente.
Questa soluzione è efficiente e non pone limiti alla profondità o al 
numero dei figli, valida per ogni evenienza.
Grazie
ciao
Alesi_27

 
nel senso che cmq non è possibile eseguirle con una sola istruzione SQL ?
ciao
Alesi_27

 SQL ?
L'inserimento (o aggiunta) e l'eliminazione prevedono 2 comandi, uno
per inserire il nodo (o fare il delete) ed uno per aggiornare i campi
Left/Right etc.
Lo spostamento prevede 3 o 4 (ora non ho sotto mano l'analisi) per
effettuare la temporanea eliminazione (es campo IsKilled = 1),
l'aggiornamento del campio Left/Right, l'inserimento e il nuovo
aggioanmento Left/Right.
Saluti.
