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.
1 De Webdeb73 -
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é :)
2 De nicocolt -
Bravo pour ce script !!