Afficher une arborescence avec menu et sous-menu.

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
  • 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.

Haut de page