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.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.