Afficher une arborescence avec menu et sous-menu.
Par Nicolas le vendredi 22 juillet 2005, 22h25 - PHP - Lien permanent
On est souvent confronté à ce type de problème: afficher sous forme d'arbre (liste ul/li par exemple) un menu ou un forum. On récupère les informations d'une base de données où chaque enregistrement comprend les champs suivants (au minimum): id, label, parent. La requête de sélection est toute simple: select id, nom, parent from table.
Imaginons que l'on est récupéré ces enregistrements là:
<?php
$tab[1] = array('label'=>'menu1','parent'=>0);
$tab[2] = array('label'=>'menu1.1','parent'=>1);
$tab[3] = array('label'=>'menu1.1.1','parent'=>2);
$tab[4] = array('label'=>'menu1.1.2','parent'=>2);
$tab[5] = array('label'=>'menu1.2','parent'=>1);
$tab[6] = array('label'=>'menu2','parent'=>0);
$tab[7] = array('label'=>'menu3','parent'=>0);
$tab[8] = array('label'=>'menu3.1','parent'=>7);
$tab[9] = array('label'=>'menu3.2','parent'=>7);
$tab[10] = array('label'=>'menu3.3','parent'=>7);
?>
On veut obtenir ça:
- menu1
- menu1.1
- menu1.1.1
- menu1.1.2
- menu1.2
- menu1.1
- menu2
- menu3
- menu3.1
- menu3.2
- menu3.3
Et le code PHP correspondant peut ressembler à çà:
<?php
function addTree(&$Tree,$feuille,$id) {
global $tab;
$Tree[$feuille['label']]['__LABEL'] = $feuille['label'];
foreach ($tab as $cle => $element) {
if ($element['parent']==$id) {
addTree($Tree[$feuille['label']],$element,$cle);
}
}
}
$Tree = array();
foreach ($tab as $cle => $feuille) {
if ($feuille['parent']==0) {
addTree($Tree,$feuille,$cle);
}
}
?>
Cette petite fonction récurssive peut sembler anodine mais elle fait tout le boulot et elle le fait bien.
Commentaires
Ce script m'intéresse pas mal pour la nouvelle version de mon site et encore plus vu qu'elle fonctionne sur le principe de récursivité :)
Bravo pour ce script !!