a proposito di funzioni ricorsive....

Risolviamo il problema dei commenti allineati su più livelli

la struttura della tabella COMMENTI è la seguente:


in questa tabella si utilizza una relazione riflessiva, in cui idPadre, se diverso da zero, punta ad un altro record della stessa tabella; se invece vale zero, quel record è considerato come una radice. di seguito è riportato un esempio di tabella con una possibile istanza di dati.
Si può utilizzare una funzione ricorsiva, del tipo riportato di seguito:






function listaCommenti($canale, $idPadre, $xdescr){

$sql="select id, descr, idPadre from commenti where idPadre= $idPadre";

$righe=mysql_query($sql, $canale);
$num_righe = mysql_num_rows($righe);

if($num_righe == 0){
return "<ul>$xdescr</u>";
}
else
{
$out="";
for($k=1; $k<=$num_righe; $k++){
$riga=mysql_fetch_array($righe);
$out .= "<UL>".listaCommenti($canale, $riga['id'], $riga['descr'])."</UL>";
}
return "<ul>$xdescr $out </ul>";
}
}


$a= microtime();

$canale = mysql_connect("localhost","root","");
mysql_select_db("5ita", $canale);


echo listaCommenti($canale, 0, "");

echo microtime()-$a;



il punto di ritorno della funzione (quella che consente di evitare loop infiniti) è dato dalla presenza di record che non hanno discendenti (es.: record con id 9,10,11,12) questo è una istanza della tabella a cui la funzione viene applicata:

Questo è l'output prodotto:

Commenti

  1. Moh, e ci è, la pattuglia acrobatica!

    Quest'anno mi sto divertendo: ragazzi simpatici e soprattutto bei colleghi. Siamo degli splendidi cinquantenni che ancora si imprisciano davanti a un problema e per una soluzione più creativa del solito.

    Per inciso, per indentarsi bisognerebbe provare ad utilizzare il tag <blockquote> invece del tag <ul>, perché <ul> senza al suo interno i <li> </li> è come lo stuzzicadenti senza la bragiuola.

    RispondiElimina
  2. aaa finalmente un aiutino proff, capita proprio a fagiuolo.

    RispondiElimina
  3. Attenzione a non sbagliare legume.

    RispondiElimina
  4. Pierangelo, ti ringrazio per la correzione sulle parentesi angolari; io da vero nubbio non ci avevo pensato e avevo messo il warning....che tu deformato professionalmente hai corretto! ;-))

    RispondiElimina
  5. Su suggerimento dell'ottimo prof. Di Nanna, ho modificato il codice, portando fuori dalla funzione le istruzioni per la connessione al database; la connessione viene effettuata una volta per tutte e la variabile $canale, contenente l'id di connessione viene passata come parametro alla funzione; in questo modo si risparmiano ben 2ms nel tempo di esecuzione totale; potrà farvi sorridere, ma passare da 20ms a 18ms significa un miglioramento del 10%; tank you, Nicola, sei sempre puntuale e preciso.

    RispondiElimina
  6. @pierangelo:

    ho letto un po' in giro; <blockquote> è deprecato per le identazioni...

    RispondiElimina
  7. Per il problema dell'indentazione, in questo documento sono sviscerati tutti i pro ed i contro delle possibili soluzioni.

    RispondiElimina
  8. @pierangelo:
    ok mi hai convinto; perciò css!

    RispondiElimina
  9. Giovanni Caputo15 marzo 2010 17:20

    spero di nn perdere MAI neank io il priscio nel trovare le soluzioni!!!!

    RispondiElimina

Posta un commento

Post più popolari