[RESOLU] boucle récursive pour fil d'ariane

LunaFOx
Invité n'ayant pas de compte PHPfrance

06 août 2008, 14:37

Bonjour,

Je suis nouvelle et sèche sur le sujet de mon topic à savoir la boucle récursive.

Voilà le fonctionnement de mon CERVEAU DE BLONDE lol !!!!!
$ici=explode("/",$_SERVER["PHP_SELF"]);
$query = 'SELECT * FROM categories WHERE url="'.end($ici).'"';//j'ai mis un champ url dans ma table categories car j'utilise des noms de page "xxx.php". Vous me suivez ? Cette table contient un id et id_parent. accueil est de niveau 0 menu 1, menu 2 sont filles d'accueil etc etc etc...
$result = mysql_query($query);
while($rows=mysql_fetch_array($result)){
echo '<a href="'.$rows["url"].'">'.$rows["intitule"].'<br />';
}
mysql_close();
Je vois à peu près où créer la récursivité mais je sèche sur le comment construire petit à petit mon fil. J'ai fait des tests en vain :(

Si vous pouviez m'aider ou du moins me guider

Bien à vous

LunaFOx

Mammouth du PHP | 1668 Messages

06 août 2008, 15:56

Qu'entends-tu par fil, Arianne, la récursivité, ça sert à appliquer une action en boucle et/ou en profondeur, je pense que pour explorer ton tableau ("$ici"), seul un foreach est nécessaire...

Ou alors...j'ai rien compris ^^"
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

LunaFOx
Invité n'ayant pas de compte PHPfrance

06 août 2008, 16:17

Merci de ta réponse.

Bah en fait quand je parle d'ariane ou de récursivité c'est qu'un élément fille dépend d'une mère qui est elle-même fille d'une mère sans tenir compte de ses soeurs.

Exemple dans ma base de test (très sexiste lol) :

id 1 accueil 0
id 2 hommes -> 1 (page fille d'accueil)
id 3 femmes -> 1 (page fille d'accueil)
id 4 blondes -> 3 (page fille de femmes)
id 5 brunes -> 3 (page fille de femmes)
id 6 rousses -> 3 (page fille de femmes)
id 7 gentils -> 2 (page fille de hommes)
id 8 riches -> 2 (page fille de hommes)
id 9 beaux -> 2 (page fille de hommes)
id 10 intelligents -> 2 (page fille de hommes)
id 11 140 de QI -> 10 (page fille de intelligents)

Je voudrais au final que si on se trouve sur la page 140 de Qi s'affiche

Accueil -> Hommes -> Intelligents -> 140 de QI (le fameux : Vous êtes ici en quelque sorte)

Plus clair ?

LunaFOx

Mammouth du PHP | 1668 Messages

06 août 2008, 16:24

Je vois, j'apellerais ça de la représentation intervallaire, je penses que c'est dans le cadre d'un forum, donc en SQL...

J'avais autre chose à dire, mais, en cherchant le tutorial, j'ai oublié :oops:
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

LunaFOx
Invité n'ayant pas de compte PHPfrance

06 août 2008, 22:59

Grâce au net et à mes piètres connaissances, j'ai réussi à adapter quelque chose mais c'est pas encore ça. J'arrive à récupérer le nom de la page, faire la récursité depuis le niveau 0 et m'arrêter à la bonne page mais ca m'affiche les soeurs et tous les id inférieurs :(

Au s'cours svp :oops:

LunaFOx

LunaFOx
Invité n'ayant pas de compte PHPfrance

07 août 2008, 10:48

Bonjour,

petite nuit pour moi et toujours mon fichu problème :?

Est-ce que quelqu'un aurait un moyen d'exclure les pages soeurs de ma boucle, en fait de préserver l'unicité du fil ?

LF

LunaFOx
Invité n'ayant pas de compte PHPfrance

07 août 2008, 11:19

Voilà où j'en suis :
$here = explode("/",$_SERVER["PHP_SELF"]);
$pagehere = end($here);
$query = 'SELECT * FROM categories WHERE url = "'.$pagehere.'"';
//echo 'query : '.$query.'<br />';
$result = mysql_query ($query);
while ($row = mysql_fetch_array ($result)){
$parent = $row["parent"];
//echo 'parent : '.$parent.'<br />';
echo '<a href="'.$row["url"].'">'.$row["intitule"].'</a><br />'; 
if ($parent!=0){
$new_query = 'SELECT * FROM categories WHERE id = '.$parent;
//echo 'new_query : '.$new_query.'<br />';
$new_result = mysql_query ($new_query);
while ($new_row = mysql_fetch_array ($new_result)){
echo '<a href="'.$new_row["url"].'">'.$new_row["intitule"].'</a><br />'; 
}
}else{
echo 'index : la page d\'accueil';
}
}
Je voudrais automatiser ma 2de requête pour qu'à partir du premier point on remonte jusqu'au niveau 0, une boucle récursive remontante. HELP phpistes !

LunaFOx

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

07 août 2008, 12:12

Indente ton code déjà, et montre nous le résultat que ça donne

LunaFOx
Invité n'ayant pas de compte PHPfrance

07 août 2008, 12:49

Bonjour ouckileou,

Ravie qu'un vip modérateur s'intéresse à mon problème (on se sent moins seule ^^)
Je veux au maximum me débrouiller car je suis pas une fainéante. Depuis ce matin, j'ai progressé et j'arrive enfin à un résultat quasi satisfaisant sauf que tout est inversé :roll:

Je pars bien de ma page pour arriver à l'accueil sauf que mon fil d'ariane donne :
index1.4.9 > index 1.4 > index 1 > home (lol)

Il n'y a possibilité de dire au mysql_fetch_array de sortir tous les enregistrements finaux de façon décroissante ou suis-je obligée de mettre tout dans un array et le retrier (un peu lourd mais bon)

Merci à toi

LunaFOx

ViPHP
ViPHP | 2291 Messages

07 août 2008, 12:54

Et un
ORDER BY `id` DESC 
Ne fonctionnerait pas :?:

LunaFOx
Invité n'ayant pas de compte PHPfrance

07 août 2008, 13:10

Merci Dunbar

j'avais essayé et bien non, car à chaque fois dans la boucle récursive il n'y a qu'un seul et unique résultat renvoyé à moins que j'ai loupé une étape...

Belle prise de tête :evil:

LF

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

07 août 2008, 13:51

Il n'y a possibilité de dire au mysql_fetch_array de sortir tous les enregistrements finaux de façon décroissante
Non puisque comme tu l'as dit toi-même, tu fais plusieurs requêtes et ne récupère qu'1 tuple à chaque fois
ou suis-je obligée de mettre tout dans un array et le retrier (un peu lourd mais bon)
Pourquoi pas oui. Tu mets ton code dans une fonction, qui te renvoie un tableau et que tu affiches ensuite. Déjà ça sépare un peu le code (traitement/affichage)

Et ce qui est lourd là dedans ce sont les select multiples, pas la manip du tableau.

=> http://uk3.php.net/manual/fr/function.array-reverse.php

LunaFOx
Invité n'ayant pas de compte PHPfrance

07 août 2008, 14:15

Bon j'ai beau cherché je n'arrive pas à déclarer et incrémenter mon tableau associatif comme il le faut/je voudrais.

Voici le code actuel :
<?php 
//on répère où on est...
$here = explode("/",$_SERVER["PHP_SELF"]);
$pagehere = end($here);
	$q = 'SELECT * FROM tb_arbo WHERE url_arbo = "'.$pagehere.'"';
	$r = mysql_query ($q);
		while ($col = mysql_fetch_array ($r)){
			$var1=$col["id_arbo"];//on définit pour point de départ et echo final
			$var2=$col["parent_arbo"];
			$var3=$col["url_arbo"];
			$var4=$col["nom_arbo"];

				function recurse($id,$par,$url){//fonction boucle récursive remontante
				$query = 'SELECT * FROM tb_arbo WHERE id_arbo = "'.$par.'"';
				$result = mysql_query ($query);
					while ($row = mysql_fetch_array ($result)){
					echo '<a href="'.$row["url_arbo"].'">'.$row["nom_arbo"].'</a> > '; 
					recurse($row["id_arbo"],$row["parent_arbo"],$row["url_arbo"]);//on boucle sur la boucle 
					}
				}
	recurse($var1,$var2,$var3);
echo '<a href="'.$var3.'">'.$var4.'</a> > '; //on affiche le fameux point de départ boucler la boucle
}
?>
Une ch'tite idée ?

Luna

Invité
Invité n'ayant pas de compte PHPfrance

07 août 2008, 14:19

J'oubliais, ca me renvoie

index 1.4 > index 1 > home (ok mais dans le mauvais sens) puis index1.4.9 par le dernier echo
mon idée étant d'inverser les enregistrements comme ceci :
home > index 1 > index 1.4 >
avec le dernier echo
home > index 1 > index 1.4 > index1.4.9 (résultat escompté)

LF

LunaFOx
Invité n'ayant pas de compte PHPfrance

07 août 2008, 14:46

JE CROIS QUE J'AI TROUVE YOUPIIII SANS ARRAY !!!!

J'ai juste rajouté

$final ="";


dans le while :
$final = $final.'<a href="'.$row["url_arbo"].'">'.$row["nom_arbo"].'</a> > ';
sans le echo

et après : recurse($row["id_arbo"],$row["parent_arbo"],$row["url_arbo"]);
echo $final;

et voilà :D

MERKI A TOUS !!!!

LunaFOx