Page 1 sur 2

boucle récursive pour fil d'ariane

Posté : 06 août 2008, 14:37
par LunaFOx
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

Posté : 06 août 2008, 15:56
par katagoto
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 ^^"

Posté : 06 août 2008, 16:17
par LunaFOx
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

Posté : 06 août 2008, 16:24
par katagoto
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:

Posté : 06 août 2008, 22:59
par LunaFOx
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

Posté : 07 août 2008, 10:48
par LunaFOx
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

Posté : 07 août 2008, 11:19
par LunaFOx
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

Posté : 07 août 2008, 12:12
par ouckileou
Indente ton code déjà, et montre nous le résultat que ça donne

Posté : 07 août 2008, 12:49
par LunaFOx
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

Posté : 07 août 2008, 12:54
par dunbar
Et un
ORDER BY `id` DESC 
Ne fonctionnerait pas :?:

Posté : 07 août 2008, 13:10
par LunaFOx
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

Posté : 07 août 2008, 13:51
par ouckileou
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

Posté : 07 août 2008, 14:15
par LunaFOx
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

LunaFOx

Posté : 07 août 2008, 14:19
par Invité
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

Posté : 07 août 2008, 14:46
par LunaFOx
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