Un sujet assez difficile à comprendre dans le monde de la programmation web pour plusieurs webmasters qui ont appris par eux-mêmes, dont je fais parti, est la technique de récursivité, où une fonction fait appel à elle-même. Cette fonction est dit récursive dans ce cas, et elle peut être nécessaire dans plusieurs situations, telles que la création d’un menu arborescent complexe où le nombre de sous-catégories n’est pas prévisible.
Commençons par la structure d’une base de donnée MySQL simple et typique pour ces catégories. Celle-ci est une table, appelée Animaux
, contenant une liste de catégories, avec leur identitification propre, leur nom, et leur lien de parenté avec une autre catégorie, si elle est en fait une sous catégorie de celle-ci dans une menu arborescent.
ID Parent Nom 1 0 Félins 2 1 Grands Félins 3 2 Panthères 4 2 Lions 5 1 Petits Félins 6 2 Tigres 8 0 Poissons 9 0 Canins 10 8 Saumons 11 8 Requins 12 9 Loups 13 9 Chiens
Le champs Parent
d’une sous-catégorie fait référence à l’identification ID
de la catégorie dont elle fait partie. Par exemple, Panthères
, avec la valeur Parent
de 2, est une sous-catégorie de Grands Félins
, identifiée par le code ID
2, et avec son code Parent
de 1, elle est elle-même une sous-catégorie Félins
, identifiée par le code ID
1. Comme Félins
est une catégorie principale qui n’a pas de lien de parenté, sa valeur pour Parent
est 0.
Pour saisir ces données et l’insérer dans une liste (array en anglais) afin de pouvoir l’organiser avec PHP, on fera appel à la fonction suivante:
$query = "SELECT ID, Parent, Nom FROM Animaux ORDER BY Nom ASC";
$result = mysql_query($query);
$categories = array();
while($row = mysql_fetch_array($result)) {
$categories[] = array(
'parent_id' => $row['Parent'],
'categorie_id' => $row['ID'],
'nom_categorie' => $row['Nom']
);
}
Si on visualise les 3 premiers éléments de la liste associative en PHP qui est maintenant en ordre alphabétique, elle ressemble à ça:
(
[0] => Array
(
[parent_id] => 1
[categorie_id] => 5
[nom_categorie] => Petits Félins
)
[1] => Array
(
[parent_id] => 9
[categorie_id] => 13
[nom_categorie] => Chiens
)
[2] => Array
(
[parent_id] => 8
[categorie_id] => 10
[nom_categorie] => Saumons
)
)
Nous avons donc maintenant le contenu de notre table dans une liste PHP organisée en ordre alphabétique. Comment l’organiser de façon à ce que la liste de menu soit affichée en mode arborescent dans une page HTML? Nous allons utiliser une fonction récursive appelée afficher_menu()
. Dans cette version, nous allons tout simplement l’afficher en mode texte de façon à rester simple et compréhensible à ce niveau du tutoriel.
function afficher_menu($parent, $niveau, $array) {
$html = "";
foreach ($array AS $noeud) {
if ($parent == $noeud['parent_id']) {
for ($i = 0; $i < $niveau; $i++) $html .= "-";
$html .= " " . $noeud['nom_categorie'] . "
";
$html .= afficher_menu($noeud['categorie_id'], ($niveau + 1), $array);
}
}
return $html;
}
Quelques explications: Alors qu’on parcoure la liste désorganisée, si on rencontre une catégorie qui a un lien de parenté avec une autre, après l’avoir ajoutée dans le code HTML (variable $html
), on fait encore appel à la même fonction afin de vérifier si celle-ci n’a pas aussi une sous-catégorie, avant de continuer les instructions additionnelles de la fonction, et ainsi de suite. On sauvegarde le nombre de fois que la fonction est appelée par elle-même dans la variable $niveau
afin de déterminer combien de symboles « – » on devrait ajouter afin de démontrer sa position dans la structure arborescente.
Ensuite, nous faisons appel à cette fonction dans la page web ou nous voulons afficher le menu. Le premier 0 de la fonction pour la variable $parent
indique que nous voulons afficher le menu en commençant avec les catégories principales à la racine qui ont une valeur de parenté de 0, mais au besoin, on pourrait seulement afficher une sous-catégorie avec une valeur de parenté différente. L’autre 0 initialise la valeur de $niveau
à 0. $categories
est évidemment notre liste précédente:
echo afficher_menu(0, 0, $categories);
Le résultat devrait être celui-ci:
Canins
- Chiens
- Loups
Félins
- Grands Félins
-- Lions
-- Panthères
-- Tigres
- Petits Félins
Poissons
- Requins
- Saumons
Maintenant, ce format n’est pas très élégant, nous allons voir comment formater ce menu textuel avec les balises <ul>
et <li>
, une façon sémantiquement correcte de présenter une liste en HTML, et qui peut, par la suite, être pleinement contrôlée en CSS pour créer un menu de navigation esthétiquement plaisant.
function afficher_menu($parent, $niveau, $array) {
$html = "";
$niveau_precedent = 0;
if (!$niveau && !$niveau_precedent) $html .= "\n
- \n";
foreach ($array AS $noeud) {
if ($parent == $noeud['parent_id']) {
if ($niveau_precedent < $niveau) $html .= "\n
- " . $noeud['nom_categorie']; $niveau_precedent = $niveau; $html .= afficher_menu($noeud['categorie_id'], ($niveau + 1), $array); } } if (($niveau_precedent == $niveau) && ($niveau_precedent != 0)) $html .= "
- \n";
$html .= "
Quelques explications: La variable $niveau_precedent
garde en mémoire le niveau précédent dans l’arborescence du menu, donc on peut la comparer au niveau actuel, $niveau
, pour voir s’il y a eu un changement pour contrôler les débuts et les fins de liste avec la balise ul
. À la ligne 6, si la variable est encore vide, on commence avec la balise ul
de la liste principale. Ensuite, à la ligne 12, si le niveau vient d’augmenter, on peut commencer avec une nouvelle balise ul
qui sera un sous-menu. On enregistre la niveau actuel à la ligne 16, et la fonction est appelée récursivement pour voir s’il y aura encore un sous-menu. Dans le cas contraire, on doit contrôler la fermeture des balises correctement.
Cette fonction va générer le code suivant:
- Canins
- Chiens
- Loups
- Félins
- Grands Félins
- Lions
- Panthères
- Tigres
- Petits Félins
- Grands Félins
- Poissons
- Requins
- Saumons
Pour ajouter des liens à chaque catégories, il suffit maintenant de modifier la ligne 14 avec celle-ci:
$html .= "
Le résultat est le suivant:
Pour apprendre à faire un menu dynamique de façon à cacher les sous-catégories et les afficher quand on clique sur son menu parent, veuillez vous référez à l’article: Comment développer des sous-menus cachés.
Bonsoir,
Merci pour cette excellente démonstration ! c’est ce que je recherchais ;-)
Par contre, j’aimerai insérer tout ça dans une liste déroulante, merci de votre aide ! Eric
Salut Martin et merci encore pour ce tutoriel.
C’est bien fait et très clair.
Je cherche à créer une liste (code html) à partir d’une table de ma BDD afin de créer un menu dynamique.
Je suis tombé hier sur la gestion d’arbres par représentation intervallaire (http://sqlpro.developpez.com/cours/arborescence/).
Ça l’air pas mal du tout !!!
Je pense que ce principe est idéal pour manipuler facilement la structure du menu.
Le hic c’est de créer la fonction PHP qui créera ma liste en html.
Je sèche un peu je dois avouer…
Tu n’aurais pas une piste à me donner ?
Merci
Est-ce moi ou il y a une erreur concernant la fermeture des balises ?
Oh… Mille pardons… C’était bien moi…
Tu es un seigneur!!!
Je viens de passer des jours pour ne meme pas achever ma propre fonction recursive. T’es trop fort !
Une petite info: L’utilisation de variables non initialisées renvoient des notices:
(genre html .= ****)
Pour l’éviter j’ai mis au début de la fonction html:
if (!isset($html)) $html = « »;
if (!isset($previous_level)) $previous_level = « »;
Merci encore!
Merci rip_pit, en effet, il semble difficile de trouver de la doc simple sur ce sujet. Pour les notices, j’ai ajouté une déclaration des variables au début de la fonction, c’est plus propre ainsi. Comme certaines personnes m’ont aussi demandé de franciser un peu plus la fonction, j’en ai profité pour traduire quelques morceaux, donc certains noms de variables ont changé aujourd’hui, pour le reste tout est pareil.
Bonjour,
Je voudrais savoir si vous seriez d’accord d’atapter vous tuto ++https://www.coinduwebmaster.com/menu-arborescent-fonction-recursive-php/89/++ a mes besoins et cela contre rémunération évidament.
D’avance merci
Waw kel demo, kel tuto, felicitations, ur the best !!! :=)
Super, ca aide pas mal, surtout pour les petits développeur. une petite question. comment afficher le nombre de produits dans chaque catégorie. j’ai une table boutique_categories avec un champs id_cat. je n’arrive pas à compter le nbre. quelqun aurais un piste svp ?
Bonjour,
Merci pour le script. j’ai une question. est-il possible d’enlever le lien sur le rubrique qui a des sous rubriques ?
merci d’avance.
Bonjour à tous !!
Cela fait 2 jours que je cherche à finaliser un système comme celui-ci, mais avec aussi du code JS qui affiche et cache les liens sur click.
J’ai passé ma journée hier à chercher, et ce matin j’ai décidé de faire moi même mes propres boucles parce que c’est vraiment complexe cette (connerie^^) de récursivité.
Je viens de terminer, voila mes sources :
function afficher_menu()
{
// Requête SQL
$query = (« SELECT ID, Parent, Nom FROM categories WHERE Parent=’0′ ORDER BY Nom ASC »); // Avec 0 on ne prend que les menus
$result = mysql_query($query);
$nb = 1;
while($row = mysql_fetch_array($result)) // la boucle va s’effectuer le nombre de titres trouvés dans la BDD
{
if ($nb != 1)
{
echo « \n »;
}
//Affichage du menu titre avec le lien pour ouvrir les sous menus
echo »« .$row[‘Nom’]. »\n »;
$id = $row[‘ID’];
// Ecriture du script pour cacher le premier groupe dans le sous menu
echo « \n »;
// Requête pour afficher les sous-catégories
$query1 = (« SELECT ID, Parent, Nom FROM categories WHERE Parent=’$id’ ORDER BY Nom »);
$result1 = mysql_query($query1);
while($row1 = mysql_fetch_array($result1))
{
$nom = $row1[‘Nom’]; // Pour éviter le problème dans la boucle while suivante
$query2 = (« SELECT ID FROM categories WHERE Nom=’$nom’ ORDER BY Nom »);
$result2 = mysql_query($query2);
while($row2 = mysql_fetch_array($result2))
{
//Affichage du lien du sous menu // POUR CHAQUE 1er sous menu // objectif : modifier ID pour avoir le lien 12 .. 13 ect
echo »« .$nom. »\n »;
////////////////////////// Fin des 2 premières catégories ////////////////////////
$IDRQ = $row2[‘ID’];
$nbl = 1;
// Requête pour afficher les derniers enfants
$query3 = (« SELECT ID, Parent, Nom FROM categories WHERE Parent=’$IDRQ’ ORDER BY Nom »);
$result3 = mysql_query($query3);
while($row3 = mysql_fetch_array($result3))
{
if ($nbl == 1) // première fois qu’on passe donc on affiche le script pour cacher les lignes
{
// Paramètre ID identique à celui affiché juste au dessus sur le parent
echo « \n »;
}
// Affichage du lien pour la rubrique
echo »« .$row3[‘Nom’]. »\n »;
$nbl++;
}
////////////////////////// Fin des 3 premières catégories ////////////////////////
}
}
$nb++;
}
}
Le script utilise la même base de donnée.
Et le il faut le script java :
function showmenu(menu) {
if (menu.style.display == ‘none’) menu.style.display = ‘block’;
else menu.style.display = ‘none’;
}
dans le header.
ENJOY !!!
Petite correction suite à un minuscule bug de fermeture de balises
à remplacer entre les 2 commentaires en fin de script :
////////////////////////// Fin des 2 premières catégories ////////////////////////
$IDRQ = $row2[‘ID’];
$nbl = 1;
// Requête de calcul pour l’affichage de la fermeture UL
$calcul=0;
$query4 = (« SELECT ID, Parent, Nom FROM categories WHERE Parent=’$IDRQ’ ORDER BY Nom »);
$result4 = mysql_query($query4);
while($row4 = mysql_fetch_array($result4))
{
$calcul++;
}
// Requête pour afficher les derniers enfants
$query3 = (« SELECT ID, Parent, Nom FROM categories WHERE Parent=’$IDRQ’ ORDER BY Nom »);
$result3 = mysql_query($query3);
while($row3 = mysql_fetch_array($result3))
{
if ($nbl == 1) // première fois qu’on passe donc on affiche le script pour cacher les lignes
{
// Paramètre ID identique à celui affiché juste au dessus sur le parent
echo « \n »;
}
// Affichage du lien pour la rubrique
echo »« .$row3[‘Nom’]. »« ;
$calcul–;
if ($calcul == 0)
{
echo » »;
}
echo »\n »;
$nbl++;
}
////////////////////////// Fin des 3 premières catégories ////////////////////////
Si je veux retourner un tableau imbriqué avec afficher_menu($parent, $niveau, $array), comment je m’y prends ? Il faut passer le tableau en paramètre dans la fonction récursive, utiliser un tableau temporaire ? Je cale ! Si vous pouvez m’éclairer, je dois avoir un problème de logique. Merci
Bonjour,
Merci pour cette source de Code, elle est vraiment impeccable.
cependant, j’ai un soucis à l’adapter pour être afficher dans un menu déroulant.
J’utilise la librairie « YUI Library » de Yahoo!. Pour voir un aperçu du menu voilà le lien :
http://developer.yahoo.com/yui/examples/menu/topnavfrommarkupwithanim_source.html
J’espère avoir bien expliquer mon Pb.
Merci d’avance.
Youpi !
Merci pour m’avoir fait découvrir la récursivité, enfin un exemple clair, ça change !
bon exemple pour la recursivité. Mais je ne recommande pas de l’utiliser tel quel, car il parcours le tableau avec une complexité en O(n2), en d’autres termes, il parcourt le tableau pour chaque élément du tableau. Pour afficher de telles données en arborescence, on a vu mieux au niveau performance (il y a des solutions avec lesquelles on ne parcourt que deux fois le tableau)…
Peux tu nous un donner un lien vers ta technique?
salut a tous, je vous remercie pour cette trés belle démonstration, c est exactement ce que j voulais faire cependant j ai essayé d’appliquer la fonction javascript showmenu a fin de cacher et dafficher le sous menu en cliquand sur son menu parent mais ça marche pas, qlq peut m aider. je lui serai reconnaissant : voici le code :
function showmenu(menu) {
if (menu.style.display == ‘none’) menu.style.display = ‘block’;
else menu.style.display = ‘none’;
}
$row[‘branche_id’],
‘parent_id’=>$row[‘parent_id’],
‘nom_br’=>$row[‘libelle_branche’]);
}
function afficher_menu($parent, $niveau, $array) {
$html = « »;
$niveau_precedent = 0;
// si le $niveau et $niveau_precedent sont vides on commence avec la balise
if (!$niveau && !$niveau_precedent) $html .= « \n\n »;
foreach ($array AS $noeud) {
if ($parent == $noeud[‘parent_id’]) {
$id=$noeud[‘branche_id’];
$nom=$noeud[‘nom_br’];
//si le $niveau vient d’augmenter, on commencer avec une nouvelle balise ul qui sera un sous-menu.
if ($niveau_precedent < $niveau) $html .= "\n\n »;
$id=$noeud[‘branche_id’];
$html .= « » . $noeud[‘nom_br’] . »–> ».$noeud[‘branche_id’]. »« ;
$niveau_precedent = $niveau;
$html .= afficher_menu($noeud[‘branche_id’], ($niveau + 1), $array);
}
}
if (($niveau_precedent == $niveau) && ($niveau_precedent != 0)) $html .= « \n\n »;
else if ($niveau_precedent == $niveau) $html .= « \n »;
else $html .= « \n »;
return $html;
} // Fin de la fonction afficher_menu()
echo afficher_menu(0, 0, $branche);
/*$bool = 1;
if(!$bool) {
echo « Variable maVariable vaut 0 »;
}
else{
echo « Variable maVariable vaut $bool »;
}*/
?>
J’ai un problème, pourtant je fait un copié collé du texte en haut.
Je donne un tableau comme cela :
###################
Array
(
[0] => Array
(
[parent_id] => 0
[categorie_id] => 9
[nom_categorie] => Mon Titre
)
[1] => Array
(
[parent_id] => 0
[categorie_id] => 10
[nom_categorie] => Mon Titre2
)
[2] => Array
(
[parent_id] => 0
[categorie_id] => 11
[nom_categorie] => Mon titre3
)
[3] => Array
(
[parent_id] => 9
[categorie_id] => 12
[nom_categorie] => Sous Titre1
)
[4] => Array
(
[parent_id] => 12
[categorie_id] => 13
[nom_categorie] => Sous Titre2
)
)
###################
Et j’obtiens :
###################
Mon Titre
Sous Titre1
Sous Titre2
Mon Titre2
Mon titre3
###################
Oups désoler j’ai mis le mauvais code :
Mon Titre
Sous Titre1
Sous Titre2
Mon Titre2
Mon titre3
ps: les * sont pour éviter la mise en forme HTML dans le commentaire.
ça prend toujours pas, je remplace les par $.
*ul$
*li$Mon Titre
*ul$
*li$Sous Titre1
*ul$
*li$Sous Titre2*/li$
*/ul$
*/li$
*/ul$
*/li$
*li$Mon Titre2*/li$
*li$Mon titre3*/li$
*/ul$
En faite j’ai rien dit, le code mal formaté ma perturbé :$
Bonjour à toutes et à tous. Félicitations pour le tuto !
J’ai une petite question : Comment faire pour ne pas afficher une rubrique si celle-ci ne contient pas de sous-rubriques ?
Merci d’avance
Bravo ! très efficace ! merci pour cette belle démonstration !
C’est tout a fait ce que je recherchais. Continues comme ça! Et merci de partager ton savoir!
Merci c’est un très bon exemple de système d’arborescence. Par contre, j’ai eu un peu de mal a visualisé les étapes, Peut être que si tu commentais ton code ce serais plus facile à comprendre pour les débutant comme moi :).
Encore merci!
excellent ce script, une matinée pour l’adapter bien comme il faut, avec notamment du js et zou….
bonne continuation.
Bonjours,
Déjà merci pour ce tutoriel.
Maintenant j’aimerais par-exemple que l’arborescence soit plus adapté au référencement, je m’explique =>
on a ça au finale :
Canins
Chiens
Loups
Félins
Grands Félins
Lions
Panthères
Tigres
Petits Félins
Poissons
Requins
Saumons
Mais j’aimerais qu’il soit comme ça :
Canins
Canins/Chiens
Canins/Loups
Félins
Félins/Grands Félins
Grands Félins/Lions
Grands Félins/Panthères
Grands Félins/Tigres
Bien-sure au préalable o pourrait faire un str_replace(); pour la variable $noeud[‘nom_categorie’].
Merci d’avance pour votre réponse
SUPER !
Je cherchais un script de ce type depuis plusieurs jours, faute d’avoir réussi à le coder moi-même…
MILLE MERCIS de le partager !
Maxime (programmeur du dimanche)
Excellent.
J’avais déjà trouvé quelque chose dans le genre mais qui nécessitait un très grand nombre d’appel de la base de donnée.(http://xl714.free.fr/menu-dynamique/)
Bilan chez Free, aux heures de pointe, ça ne passait plus.
En combinant votre façon de construire le menu et son éditeur très simple et pratique j’ai pu me construire facilement l’outil que je recherchais pour le site de mon club
Merci bien pour ce topo!
Jean-Patrick , autre programmeur du dimanche…content! ;)
Merci beaucoup cousin, tu confirme le dicton qui dit qu’on ne peut plus rien inventer sur la lune. J’ai facilement trouvé après avoir longtemps cherché. Encore mille merci.
Merci pour ce magnifique tuto, cependant comment adapter cela avec des balise ?
Merci
Bonjour,
Ta fonction est géniale, cependant je souhaiterais savoir comment retrouver la catégorie parent.
Je m’explique, j’ai utilisé ta fonction pour un menu déroulant vertical en jQuery et je souhaiterais afficher une flèche lorsque que l’élément contient un ou plusieurs fils.
Comment dois-je procéder ?
Merci d’avance
bjr…j’ai testé ce tutoriel , il fonctionne très bien..
mais j’ai un problème en utilisant les deux variable [parent_id] et [categorie_id] de type varchar
exp :
parent_id=12345687 (type varchar et non int)
categorie_id=7777777 (type varchar et non int)
le problème est le sous menu, en fonction réciproque
$html .= afficher_menu($noeud[‘categorie_id’], ($niveau + 1), $array);
rmq: je travaille sous joomla
quelqu’un peut m’aide svp ??
oops…. jai fais une grande fausse :)
j’ai trouver mon problème
j’ai déclaré :
___ID_____ __Parent__
—————|—————
11111111 | 12345687
12345687 | 11111111
——————————-
j’ai corrigé ….et merci :)
pour un menu deroulant :
function afficher_menu($parent, $niveau, $array) {
$html = « »;
foreach ($array AS $noeud) {
if ($parent == $noeud[‘parent_id’]) {
$html .= « »;
for ($i = 0; $i < $niveau; $i++) $html .= "-";
$html .= $noeud['categorie_id'].$noeud['nom_categorie'] . " »;
$html .= afficher_menu($noeud[‘categorie_id’], ($niveau + 1), $array);
}
}
return $html;
}
echo »;
echo afficher_menu(1, 0, $categories);
echo »;
Merci beaucoup.
Ce script est super, court et efficace!!
Je débute en php, et j’aurais besoin que les résultats soient renvoyés dans un tableau (car j’ai d’autres infos à mettre avec le nom comme contenu page, description, etc…)
Avez-vous des pistes?
Merci encore
Bonjour,
J’ai intégrer le script de base dans une liste déroulante:
$html .= » « ;
//affichage de l’arborescence dans la liste déroulante
// on parcours la liste
foreach ($array AS $noeud) {
//si on rencontre une catégorie qui a un lien de parenté avec une autre
if ($parent == $noeud[‘parent_id’]) {
//on sauvegarde le nombre de fois ue la fonction est appelée par elle-meme dans $niveau pour déterminé le nombre de symbole a ajouté
for ($i = 0; $i < $niveau; $i++) $html .= "–";
$html .= " " . $noeud['nom_page'];
$html .=" »;
$html .= liste_page3($noeud[‘Id_page’], ($niveau + 1), $array);
}
}
et ça fonctionne très bien…
Savez-vous comment on peut préselectionner une valeur de la liste liste (un parent) en fonction de la BDD.
J’ai testerplein de truc, notamment ça :
if(isset($Id_parent) && $Id_parent == $noeud[‘nom_page’])
{
$html .= « »;
} else {
$html .= » « ;
}
Mais ca marche pô! :(
SVP… help me!
Bonjour,
est-il possible d’avoir une petite mise à jour pour faire un chemin de navigation (breadcrumb) lorsqu’on navigue dans les catégories ? Ce serait super !
Merci
Bonjour,
Merci pour le tuto, il me sert à beaucoup de choses dans l’appli admin sur lequel je travaille en ce moment. Toutefois, j’ai du mal à intégrer la liste finale dans un . Si quelqu’un pourrait me guider. Merci d’avance.
Laurent >> pour le breadcrumb, tu te sers de la même fonction que tu as utilisé pour créer le menu dans la bdd pour récupérer le fil.
… je voulais dire : Comment intégrer la liste finale à l’intérieur d’une balise SELECT.
Merci
bonjour,
j’ai un problème pour créer une arbre généalogique des feuille parrainés dans mon boutique prestashop 1.5
la table nommé ps_referralprogram
(id_referralprogram,id_sponsor,email,lastname,firstname,id_customer)
par exemple X est le parain de Y : X a pour id_customer=1 donc Y a pour id_sponsor =1
exemple de genealogie:
pour chaque feuille de generation prend 100$
sachant que chaque parrain parriné deux feuilles seulement
merci de m’aider SVP SVP SVP SVP SVP SVP
mon email : wajdichatbouri@gmail.com
merci d’avance :)
Bonjour,
Le script est super mais comment afficher les menu de niveau 2 et 3 la fonction permet d’afficher que les niveau 1.
Merci pour vos futurs réponses ;)
Un énorme merci ! Elle commençait à me rendre fou cette fonction ! Récursivité ok. Mais fermeture des balises dans le bon sens dur dur ! Merci !
bonjour, merci pour ce tuto.
j’aimerai aller un peu plus loin et savoir comment à partir du récursif récupérer qu’une seule branche, par exemple :
Félins
– Grands Félins
— Lions
.?
On peut accélérer le traitement en ajoutant une clé $key dans la boucle foreach, ce qui permet de supprimer le noeud qui vient d’être traité. De cette façon le tableau $array se réduit au fur et à mesure que l’arbre se construit.
function afficher_menu($parent, $niveau, $array){
$html = « »;
foreach ($array AS $key => $noeud) {
if ($parent == $noeud[‘parent_id’]) {
for ($i = 0; $i < $niveau; $i++){
$html .= "-";
}
$html .= " " . $noeud['nom_categorie'] . " »;
unset($array[$key]);
$html .= afficher_menu($noeud[‘categorie_id’], ($niveau + 1), $array);
}
}
return $html;
}