OVH Cloud OVH Cloud

Fonction recursive

1 réponse
Avatar
Remy LAPLEIGE
Bonjour,

je souhaite dans une fonction récursive faire la différence entre le
père et le fils. Le but étant de créer une arborescence pour un site web.

Je m'explique ... dans la fonction donnée ci-joint, l'appel "echo" ou
"print" n'est appellé qu'1 fois ... et donc cela permet d'afficher le
père et le fils ... de la même manière.

Comment dois-je faire pour que par exemple, j'appelle le "père" avec une
couleur bleue et le "fils" avec une couleur rouge ?

Ceci me permettrait donc de faire la différence entre le père et le fils
et de notamment faire un traitement totalement différent ..

Merci beaucoup pour votre aide


voici les sources :


<?php

// Cette page permet de créer une fonction de récursivité
// But : Créer un menu à partir d'une table mysql afin de créer une
arborescence
// Maintenant, les articles sont ajoutées au fur et à mesure, de manière
à créer un plan du site

require ("connect.php");

// Fonction qui met en forme l'arboresence
function espace($RANG) {
$CH="";
for ($X=0;$X<$RANG;$X++) {
$CH.="&nbsp;&nbsp;&nbsp;&nbsp;";
}
return $CH;
}

function liste_article($ID_PERE,$RANG) {
// requete SQL
$REQ_LISTE = "SELECT * FROM article WHERE Rid_arb='$ID_PERE' ";
if (!$REQ2_LISTE = mysql_query($REQ_LISTE)){
print ("Erreur de la requète $REQ_LISTE !<BR>");
exit();
}
// on va parcourir l'ensemble des données
while ($DATA = mysql_fetch_array($REQ2_LISTE)) {
$TITRE=$DATA['titre_article'];
$ID_PERE=$DATA['Rid_arb'];
// Affichage
echo espace($RANG)."<B><A HREF='#.php'>".$TITRE."</A></B><BR>";
}
}

function recursive($PERE,$RANG) {
// requete SQL
$REQ_ARBO = "SELECT * FROM arborescence WHERE id_arb_parent='$PERE' ";
if (!$REQ2_ARBO = mysql_query($REQ_ARBO)){
print ("Erreur de la requète $REQ_ARBO !<BR>");
exit();
}

// on va parcourir l'ensemble des données
while ($DATA = mysql_fetch_array($REQ2_ARBO)) {
$ID_ENFANT=$DATA['id_arb'];
$ID_PERE=$DATA['id_arb_parent'];
$NOM_CAT=$DATA['nom_cat'];

// Si l'id de la catégorie est une catégorie PERE
if($ID_PERE==$PERE) {
// On affiche les fils
echo espace($RANG).$NOM_CAT."<BR>";
recursive($ID_ENFANT,$RANG+1);
liste_article($ID_ENFANT,$RANG+2);
}
}

}
// On appel la fonction dans la page
recursive(0,0);

?>

@+

rémy

1 réponse

Avatar
Guillaume Bouchard
Remy LAPLEIGE wrote:
Bonjour,


Bonjour,

je souhaite dans une fonction récursive faire la différence entre le
père et le fils. Le but étant de créer une arborescence pour un site web.


Oki.

Comment dois-je faire pour que par exemple, j'appelle le "père" avec une
couleur bleue et le "fils" avec une couleur rouge ?


Ce qui m'embete c'est que chaques fils à forcement un pere qui peut être
le fils d'un autre ? Tu ne veux que le pere principal en bleu ?


require ("connect.php");

// Fonction qui met en forme l'arboresence
function espace($RANG) {
$CH="";
for ($X=0;$X<$RANG;$X++) {
$CH.="&nbsp;&nbsp;&nbsp;&nbsp;";
}
return $CH;
}


ou plus simplment avec str_repeat('&nbsp;', 4 * $RANG);
Maitenant je pense que pour ton rendu html t t'y prend mal à coup de &nbsp;
Il faudrait mieux utiliser des listes :

<ul>
<li>Pere
<ul>
<li>fils</li>
<li>fils</li>
</ul>
</li>
<li>pere sans fils</li>
</ul>


function liste_article($ID_PERE,$RANG) {
// requete SQL
$REQ_LISTE = "SELECT * FROM article WHERE Rid_arb='$ID_PERE' ";


Si ton ID_PERE est un entier, pourquoi le proteger par des quotes ?

function recursive($PERE,$RANG) {
[...]
// on va parcourir l'ensemble des données
while ($DATA = mysql_fetch_array($REQ2_ARBO)) {
$ID_ENFANT=$DATA['id_arb'];
$ID_PERE=$DATA['id_arb_parent'];
$NOM_CAT=$DATA['nom_cat'];

// Si l'id de la catégorie est une catégorie PERE
if($ID_PERE==$PERE) {
// On affiche les fils
echo espace($RANG).$NOM_CAT."<BR>";

recursive($ID_ENFANT,$RANG+1);


Tu rappels la fonctione pour voir si le fils à des fils. Ok ?

liste_article($ID_ENFANT,$RANG+2);


Pourquoi $rang + 2 ? Soit je n'ai rien comprit à ton algo, soit il y a
comme un problème... (j'opterais pour la solution 1, je suis fatigué,
mais on ne sais jamais.)

Si j'ai bien comprit, tu as une arborescense de categories et des
articles qui sont associés à des categories.

Déjà, je ne connais pas la taille de ton arboresence de categories, mais
si elle n'est pas immense, pourquoi ne pas récuprer d'un seul jet,
cela t'eviteras de faire plusieurs requetes SQL au prix seulement d'un
petit peu de code PHP. (À quand un systeme de select sous forme
d'arboresences ? Je sais que c'est possible avec un autre schema de table.)

Après il est trés simple comme tu l'as fait de selectionner les articles
qui correspondent à une categorie. Mais je ne comprand pas pourquoi
$rang + 2 ?

--
Guillaume.