Bene, visto che sul forum ho visto parecchie richieste di aiuto riguardo la creazione di un sistema di directories e

sottodirectories e visto che in rete la documentazione in italiano a riguardo è inesistente (o almeno io non ho trovato

niente) ho deciso di scrivere questa pillola su come porre rimedio a questo problema.
Cominciamo con un po' di teoria.
I sistemi che sono maggiormente usati per raggiungere lo scopo in oggetto sono due:

1) Gestione gerarchica
2) Gestione orizzontale

Noi eamineremo solo la prima di queste due alternative.
La ricorsione è un sistema ampiamente usato in programmazione attraverso il quale una funzione richiama se stessa.
La ricorsione è alla base del nostro sitema.
Ovviamente ci sono vantaggi e svantaggi.
I vantaggi sono che il sistema è molto più semplice da utilizzare.
Gli svantaggi che per ogni record va fatta una query, la ricorsione è cmq un processo più lento rispetto ala gestione

orizzontale (che invece utilizza una sola query) e di conseguenza non va molto bene per ottenere alberi molto grandi con una

gerarchia abbastanza ramificata.

Bene, fatte le chiacchiere passiamo alla pratica.
Cominciamo con l'organizzazione del db.

Abbiamo una tabella "categories" con i campi id,name,parent

id = è l'id univoco del record (autoincrement)
name = il nome della categoria
parent = l'id della categoria padre (se zero significa che la categoria non è una sottocategoria)

Vi faccio un esempio per farvi capire come sarebbe nel db l'insieme di dati:

codice:
+------+-----------------+----------+
|  ID  |  NAME           |  PARENT  |
+------+-----------------+----------+
|  1   | Programmazione  |     0    |
+------+-----------------+----------+
|  2   | C               |     1    |
+------+-----------------+----------+
|  3   | Guide           |     2    |
+------+-----------------+----------+
|  4   | Tutorials       |     2    |
+------+-----------------+----------+
|  5   | Pascal          |     1    |
+------+-----------------+----------+
|  6   | Guide           |     5    |
+------+-----------------+----------+
|  7   | Tutorials       |     5    |
+------+-----------------+----------+
Passiamo alla costruzione della funzione (la posto ora per comodità e poi passo a spiegarvi come funziona).


Codice PHP:
 1 function ShowCats ($id,$name,$level)
 
2         {
 
3           global $categories;
 
4         $query "SELECT id,name,parent FROM categories WHERE parent=$id ORDER BY name";
 
5          
 6         $result 
mysql_query($query,$db);
 
7         while ($row mysql_fetch_array($result))
 
8          {
 
9             $name str_repeat("",$level) . $row['name'] .  "\n";
10             $categories["$name"] = $row['id'];
11             ShowCats ($row['id'],$name,$level+1);
12              }
13         return $categories;
14         
riga 1
Definizione del nome della funzione e parametri da passarle

$id = è l'id della categoria che fungerà da root. In pratica la categoria a partire dalla quale vogliamo far partire la

funzione
$name = il nome della categoria passata
$level = un contatore che servirà per costruire graficamente l'albero

riga 3
Definiamo come globale una variabile definita all'esterno della funzione. La variabile va definita come array
$categories = array();

riga 4,6,7
Il codice per estrarre i record dal db

riga 9
str_repeat ripete la stringa indicata come primo parametro x volte dove x è un numero indicato dal seconod parametro (avete

capito a cosa srviva $level?)
Questa è la parte che "costruisce" graficamente l'albero.

riga 10
inseriamo nell'array il nome della categoria ed il suo id

riga 11
Ed eccoci arrivati all'oggetto di questa pillola: la ricorsione.
Come vedete la funzione richiama se stessa passando i dati che ha estratto e costruito

riga 13
Dopo aver eseguito tutte le operazioni ritorna l'array $categories riempito con il nostro bell'albero.


Vi starete chiedendo: "Ora ho estratto tutti i dati e li ho messi nell'array. E mò come li mostro?"

E' presto data una risposta alla domanda che vi sta frullando in testa.

In questo semplice modo:

1) Fate una query estraendo tutti i record dove parent = 0
2) nel ciclo while per ogni record estratto richiamate la funzione di sopra
3) Altro cicolo while sull'array

Codice PHP:
//seleziono tutte le righe dove "padre = 0" estraendo id e nome
$QueryCategories "SELECT id,name,parent FROM categories WHERE parent = 0 ORDER BY name";
$ResultCategories mysql_query($QueryCategories);
while (
$RowCategories mysql_fetch_array($ResultCategories))
     {
    
//definisco l'array che poi mi servirà per la funzione
        
$categories = array();
    
        
// Richiamo la funzione
        
ShowCats($RowCategories['id'],$RowCategories['name'],'catalogo_categories',1);
    echo 
$RowCategories['name'] . ' [' $RowCategories['id'] . ']';
        while (list(
$name$id) = each ($categories))
             {
        echo 
$name ' [' $id ']';
         } 
// End while list     
// End while query 

Otterrete così qualcosa del tipo

nome_categoria [id_categoria]

Abbiamo finito. Semplice no?!
Spero di aver fatto cosa gradita scrivedo questa pillola.
A questo punto possiamo salutarci e non mi resta che dirvi di postare migliorie al codice, perplessità, consigli, perchè no... complimenti e tutto quello che vi passa per la testa (senza andare OT ovviamente!)