Ti crei una tabella, chiamiamola "menu", che ha questi campi:
id_menu (autoincrementante, chiave primaria)
intestazione (stringa, intestazione del ramo)
id_menu_padre (per i sotto-elementi)
livello (intero, riferimento interno)
Facciamo conto che il livello 1 sia formato da tutti i capitoli (elemnti "padri"), il livello 2 dai paragrafi (elementi "figli") ed il livello 3 dai sottoparagrafi (sotto-elementi figli). Questo sistema ti permette potenzialmente di estendere all'infinito le ramificazioni dell'albero, basta andare avanti con i livelli.
Il campo "id_menu_padre" vale 0 per gli elementi di livello 1 (padri), mentre per tutti i sotto-elementi deve contenere l'id dell'elemento di livello immediatamente superiore sotto il quale risiede.
Ad esempio, l'id_menu_padre del "Capitolo 1" sarà 0; quello del "Paragrafo 1" sarà l'id_menu del "Capitolo 1"; quello del "Sottoparagrafo 2" sarà l'id_menu del "Paragrafo 1" ecc ecc.
Una volta costruita questa tabella ti serve soltanto una fuzione ricorsiva che vistualizzi l'albero con le giuste ramificazioni. La funzione non deve fare altro che ricercare i sotto-elementi di un elemento passato, visualizzarli e richiamare se stessa incrementando il livello. E deve partira da 0.
Ho buttato un po' di codice al volo, non l'ho testato ma dovrebbe funzionare:
Codice PHP:
function printMenuTree($id_menu_padre, $livello, $spacer_img='img/spacer.gif') {
global $dbLink;
$spacer_width = 1;
if ($livello>1)
$spacer_width = 15 * $livello; // larghezza dell'immagine che crea lo spostamento sulla destra dei sotto-elementi
$rs=mysql_query("SELECT id_menu, intestazione, livello, id_menu_padre FROM menu WHERE id_menu_padre=".$id_menu_padre." ORDER BY intestazione", $dbLink) or die ("Impossibile eseguire la query [" . mysql_error() . "]");
while ($row=mysql_fetch_array($rs)) {
$id_menu = $row['id_menu'];
print("<tr><td>[img]".$spacer_img."[/img]".stripslashes($row['intestazione'])."</td></tr>");
printMenuTree($id_menu, $livello+1, $spacer_img);
}
unset($row);
unset($spacer_width);
mysql_free_result($rs);
}
$dbLink è il puntatore alla connessione MySQL (quello che viene creato con la funzione "mysql_connect" quando ti connetti al database).
$spacer_img è il percorso+nome di un'immagine GIF di 1x1 pixel, trasparente, che server simulare la spaziatura verso destra dei sotto-elementi, quando crei l'albero.
Ora la funzione ricorsiva è fatta, non ti resta che richiamarla dalla tua pagina php in questo modo:
Codice PHP:
print("<table border=0 cellpadding=0 cellspacing=0 class='testo' width='100%'>");
printMenuTree(0, 0, 'img/spacer.gif');
print("</table>");
Dovrebbe funzionare senza problemi.... fammi sapere.