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:
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:
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:
Moh, e ci è, la pattuglia acrobatica!
RispondiEliminaQuest'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.
aaa finalmente un aiutino proff, capita proprio a fagiuolo.
RispondiEliminaAttenzione a non sbagliare legume.
RispondiEliminaPierangelo, 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! ;-))
RispondiEliminaSu 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@pierangelo:
RispondiEliminaho letto un po' in giro; <blockquote> è deprecato per le identazioni...
Per il problema dell'indentazione, in questo documento sono sviscerati tutti i pro ed i contro delle possibili soluzioni.
RispondiElimina@pierangelo:
RispondiEliminaok mi hai convinto; perciò css!
spero di nn perdere MAI neank io il priscio nel trovare le soluzioni!!!!
RispondiElimina