ALBERO COLLASSABILE E RICORSIVITA' Il codice che nessuno vi ha dato


Tempo fa, mi è stato chiesto di fare un semplice menu ad albero collassabile. Per chi di noi ha bisogno di un leggero ripasso su cosa significhi ( nessuno, ma dovrò pure scrivere qualche riga ogni tanto pure io, no? ) un albero collassabile non è altro che il menù sacrosanto e sacro e sempiterno, sopravvissuto a svariate generazioni di sistemi operativi diversi, necessario a “esplorare le nostre risorse”. No, non sono un reclutatore di scientology, ma solo un compagno di strada, che vuole condividere con voi alcune chicche, esattamente come voi fate con lui, su forum e vecchie discussioni sullo sviluppo di sorgenti per il web.


Un esempio di un Menù ad albero collassabile...


Quindi, le operazioni necessarie ad ottenere questo dolcissimo frutto, sono due.
1) La prima è necessaria a vedere il contenuto di una cartella all'interno di una cartella o directory
2) La seconda è dedicata alla parte di visualizzazione di questi dati, tramite l'amatissima jquery.
Ora, la prima riguarda pura programmazione php, e una “tecnica” tra le più interessanti: la ricorsività...continua>>>



da wikipedia: Viene detto algoritmo ricorsivo un algoritmo espresso in termini di sé stesso, ovvero in cui l'esecuzione dell'algoritmo su un insieme di dati comporta la semplificazione o suddivisione dell'insieme di dati e l'applicazione dello stesso algoritmo agli insiemi di dati semplificati.
Tale tecnica risulta particolarmente utile per eseguire dei compiti ripetitivi su di un set di input variabili. L'algoritmo richiama se stesso generando una sequenza di chiamate che ha termine al verificarsi di una condizione particolare che viene chiamata condizione di terminazione, che in genere si ha con particolari valori di input.


Se credete di aver capito, ma non potreste giurarlo su vostra madre ( e neanche io potrei, avendo solo letto wikipedia), continuate a leggere la spiegazione più approssimativa che ve ne do io, altrimenti saltate al codice.


SPIEGAZIONE APPROSSIMATIVA
Immaginiamo di avere una cartella con nome img2. Dentro questa cartella esistono due sotto cartelle: immagine e video.
Dentro immagini, ci sono dei file, e un'altra cartella, e cioè hotel.
IMG2
IMMAGINi
img1.jpg
img2.jpg
HOTEL
VIDEO
Ora, noi potremmo, fare del codice specifico per leggere solo questo percorso, ma sarebbe un grande spreco di ingegno e capacità. La sola soluzione accettabile è quella di sviluppare del codice capace di leggere dentro una cartella a lui “sconosciuta” e quindi tirarne fuori tutto quello che c'è. Come realizzarla?
Prima di partire con il codice, un minimo di “teoria” partiamo con l'esempio più sciocco, ma che fa tanto Piero Angela.


A noi serve, per poter leggere il contenuto di una cartella, una funzione che possa “richiamare se stessa” e cioè, immaginate un talpone che scavi in una galleria, e che sia alla ricerca di vecchie gallerie. Inizia a scavare una galleria prima inesistente, quindi nel proprio percorso trova un accenno di galleria. Inizia a esplorare questa “vecchia galleria” una volta che l'ha esplorata tutta, torna al punto di partenza, e cioè alla nuova galleria che stava costruendo. Se mentre stava esplorando la vecchia galleria, avesse trovato una galleria ancora più vecchia, avrebbe dovuto interrompere la seconda ricerca, e quindi iniziare la terza, e così via, fino a trovare tutte le sotto-diramazioni.


Dobbiamo quindi creare questo talpone, cioè un essere ”cieco” votato alla ricerca.
Il codice che descriviamo fra un po', serve proprio a questo, e cioè noi diamo a lui una directory (img2), e cioè la galleria principale. Il nostro talpone inizia a scavare e trova un'altra galleria, “immagini” quindi vi entra dentro e vi cerca. Se trova solo file, bene, ce ne riporta notizia e torna a esplorare img2, ma se vi è dentro IMMAGINI un'altra cartella, ecco che deve esplorare la nuova cartella dentro a IMMAGINI e cioè HOTEL. Una volta che avrà fatto e che avrà visto ciò che è dentro immagini, si dedicherà a video, etc, etc..
Questo come si traduce in termini di programmazione? Nel creare una funzione che richiami se stessa.
Cioè, noi lanciamo una funzione del genere
  • function Leggi( Cartella)
  • {
  • Apri il percorso cartella
  • fino a che(trovi elementi)
  • {
  • leggi l'elemento
  • l'elemento è un file?
  • Se si, stampa semplicemente a video il percorso cartella
  • Se no, stampa a video l'elemento e richiama Leggi(con il percorso dell'elemento trovato)
  • spostati di un elemento all'interno di cartella
  • }
  • }
IL CODICE
che in php traduciamo così:
  • function leggi($path)
  • {
  • //definire la cartella MADRE da analizzare
  • //if ($path=="")$path = "../img2/";
  • //apriamo la directory
  • $dir_handle = @opendir($path) or die("Impossibile aprire $path");
  • while ($file = readdir($dir_handle))
  • {
  • if ($file!="." && $file!="..")
  • {
  • //il nome file+path
  • $pos="$path/$file";
  • $pos2="../$path/$file/";
  • $n = substr_count($pos, "/");
  • $n=$n-2;
  • $classe="li$n";
  • if (is_dir($pos)) {
  • echo 'li class="'.$classe.'" id="'. $pos2.'">' ;
  • echo $file.'ul';
  • //leggi($pos,$i);
  • leggi($pos);
  • }
  • else {
  • //echo "li".$file.'/li';
  • }
  • }
  • //echo '
  • a'.$vettore[$i][0].$vettore[$i][1];
  • }
  • echo '/ul /li';
  • closedir($dir_handle);
  • }
Se usate questo codice, ricordatevi di sostituire ul, /ul li, /li con i veri tag
Perché usiamo i tag ul e li?
Perché le liste sono io modo più saggio e probabilmente più raccomandabile di affrontare la situazione.Infatti facendo le cose ammodo, alla fine otterremo qualcosa del genere
  • <ul>
  • IMMAGINi
  • li img1.jpg /li
  • li img2.jpg /li
  • ul HOTEL /ul
  • </ul>
  • ul VIDEO /ul
Perfetto per un successivo utilizzo di jquery, o qualsiasi altro metodo utile a descriverne il comportamento grafico.
Finisce qui il mio contributo risolutivo di come fare un albero colassabile con jquery, ve ne parlano molti tutorial sulla rete, basta cercare su google. Io vi ho dato il codice che solitamente nessuno condivide, e non so come mai, sinceramente. Ho dovuto faticare un po' sulla chiusura dei tag, e cioè su /li /ul
e ma detto questo non rappresenta problemi particolari. All'interno di leggi, vi ho lasciato volutamente vecchio codice commentato, è codice di “controllo” diciamo così, e potrete, levando il commento, controllare cosa fa il nostro talpone, mentre cammina. Farvene dare note di viaggio, insomma. Il vero problema è il tempo, che come tutti noi sappiamo e incredibilmente prezioso. Alla prossima!

Marco Bellomo

Commenti

Post più popolari