Newsgroup: it.comp.www.php
Titolo: funzione per lettura db gerarchico

ciao,
ho rovato on line la seguente funzione:
function display_children($parent, $level) {
   // retrieve all children of $parent
   $result = mysql_query('SELECT title FROM tree '.
                          'WHERE parent="'.$parent.'";');
   // display each child
   while ($row = mysql_fetch_array($result)) {
       // indent and display the title of this child
       echo
str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;',$level).$row['title']."<br>";
       // call this function again to display this
       // child's children
       display_children($row['title'], $level+1);
   }
}
non riesco a capire una cosa: alla fine del ciclo WHILE, viene fatta una
chiamata ricorsiva sulla stessa funzione... ma questo non dovrebbe
interrompere il ciclo compromettendo la visualizzazione corretta dei dati?
io l'ho provata e funziona... ma non la capisco!! ho provato a seguire
mentalmente i vari passaggi ad ogni ciclo ma sto andando fuori di testa...
so che per voi è una banalità ma vorrei capire come cacchio funzia :))
grazie mille a chi mi spiega
ciao!!
Tex

Tex wrote:

perchè dovrebbe interrompere il ciclo?
semplicemente richiama se stessa ed al termine di ogni eventuale chiamata
ricorsiva re testa la condizione del while..
-- 
www.iuz-lab.info

 ricorsiva re testa la condizione del while..
scusa non ho capito
io sto facendo casino perchč il ciclo si trova all'interno della funzione
forse...
io sto seguendo l'esempio riportato qui:
http://www.sitepoint.com/article/hierarchical-data-database
 cosě potete
vedere anche i dati che vengono letti... ho ricreato la tabella del db tale
e quale.
io interpreto il codice cosě:
1 - viene richiamata la funzione display_children('',0);
2 - viene eseguita la query che come risultato da "Food"
3 - parte il WHILE che dovrebbe ciclare 2 volte dato che ci sono due "Food"
nel campo PARENT (giusto?)
4 - il primo ciclo stampa a video "Fruit"
5 - viene effettuata la chiamata ricorsiva alla funzione praticamente cosě:
display_children('Fruit',0);
6 - si riesegue il tutto ... ma poi mi perdo quando si arriva all'ultimo
child ovvero "Pear" che non č parent di nessuno!
ma dove cacchio mi sto impappinando?? :((


Per capire meglio prova a lanciare la funzione utilizzando come parent 
una foglia dell'albero piuttosto che la radice.
Comunque cerco di spiegarti la cosa:
- lanci la funzione sul nodo prescelto
- la funzione esegue una query che trova tutti i sotto-nodi che hanno 
come genitore il nodo prescelto
- il ciclo while esegue due operazioni: stampa i nodi figli e verifica 
che ognuno di essi abbia dei sotto-figli; per effettuare la verifica 
effettua la chiamata ricorsiva (e ti ricolleghi al primo punto); se non 
ci sono sotto-figli, la funzione semplicemente ritorna e il ciclo che 
era rimasto in sospeso riprende...
Spero di esserti stato d'aiuto.

 era rimasto in sospeso riprende...
e praticamente viene letto il secondo indice dell'array ($row)? è giusto?

 e praticamente viene letto il secondo indice dell'array ($row)? è giusto?
No, l'array row viene ricreato ad ogni ciclo di while e contiene per 
ogni passaggio solo il valore 'title' del nodo corrente.
Non mollare che ci sei quasi ;-)

 Non mollare che ci sei quasi ;-)
mi sà che non ha ancora chiaro come funziona la ricorsività e come viene
gestita.. 
-- 
www.iuz-lab.info


Probabile... ma a forza di sbatterci la testa...

> Probabile... ma a forza di sbatterci la testa...
se non rispondo è  solo perchè sto lavorando a un progetto, ma appena ho un
attimo di tempo tornerete a sentire le botte della mia testa che sbattono
sulla funzione ricorsiva :)))
a presto!
Tex