Lecture et ou construction d'un tableau

Eléphant du PHP | 177 Messages

07 avr. 2007, 15:42

Bonjour à tous, je viens partager une prise de tête avec vous car je suis perdu dans mon code ....

je bricole un menu a trois sous-niveau stocker dans une BD, jusque la tout vas bien. J'ai réussi a afficher ce menu de manière plus satisfaisante grasse à des while de while de while.. de mysql_fecth_assoc ...
Pensant que cela ne serait pas franchement bien en cas d'une grosse fréquentations du site je tente de transformer ce script en deux requette sql pour construire un tableau et d'en faire une simple lecture...

Voici le tableau que j'obtiens :

Code : Tout sélectionner

Array ( [sous_menu_techno] => Array ( [id_menu] => 59 [parent] => 45 [titre] => sous_menu_techno [ordre] => 1 ) [sous_menu 3] => Array ( [id_menu] => 63 [parent] => 43 [titre] => sous_menu 3 [ordre] => 1 ) [vasou] => Array ( [id_menu] => 36 [parent] => 0 [titre] => vasou [ordre] => 1 ) [sous_sous_menu 3] => Array ( [id_menu] => 64 [parent] => 63 [titre] => sous_sous_menu 3 [ordre] => 1 ) [Techno] => Array ( [id_menu] => 45 [parent] => 36 [titre] => Techno [ordre] => 1 ) [the best] => Array ( [id_menu] => 82 [parent] => 81 [titre] => the best [ordre] => 1 ) [essaieuuu] => Array ( [id_menu] => 108 [parent] => 88 [titre] => essaieuuu [ordre] => 1 ) [re pouet toi] => Array ( [id_menu] => 109 [parent] => 108 [titre] => re pouet toi [ordre] => 1 ) [t�st 3] => Array ( [id_menu] => 12 [parent] => 0 [titre] => t�st 3 [ordre] => 2 ) [sous titre] => Array ( [id_menu] => 13 [parent] => 12 [titre] => sous titre [ordre] => 2 ) [outils] => Array ( [id_menu] => 71 [parent] => 36 [titre] => outils [ordre] => 2 ) [menu 3] => Array ( [id_menu] => 43 [parent] => 0 [titre] => menu 3 [ordre] => 3 ) [Soso] => Array ( [id_menu] => 81 [parent] => 0 [titre] => Soso [ordre] => 4 ) [pouet] => Array ( [id_menu] => 88 [parent] => 0 [titre] => pouet [ordre] => 6 ) )
pour l'obtenir :
while($constructionmenu=mysql_fetch_assoc($sqlniveau)  )
	{
		$menu0[$constructionmenu[titre]]= $constructionmenu;
	}
mes menu ont comme parents la valeur 0. Je les affiche grace à :
foreach ($menu0 as $menu) {
	 if ($menu[parent]==0)
	 	{
			echo "<li>".htmlentities($menu[titre])." id= ".$menu[id_menu]."<br />";
			$fils==$menu[id_menu];
		}
et mon soucis et que je ne parviens pas a choper la logique qui me permettera d'afficher les sous menu sous-sous menu de chaque menu .
La je je suis sur :
	if ($menu0["$menu[titre]"][parent]==$fils)
		{echo "<li>".htmlentities($menu0["$menu[titre]"][titre])."<br />";}
	echo $menu0["$menu[titre]"][titre]."<br />";
	echo $menu0["$menu[titre]"][parent]."<br />";
	echo $menu0["$menu[titre]"][id_menu]."<br />";
}
qui est la fin de mon foreach.
Tout conseils sont les bien venu.
PS: si le visuel du bordel peut etre utile pour répondre dites le je donnerais l'url .
Merci d'avance a ceux qui oserons ce pencher sur ce code.

Mammouth du PHP | 19672 Messages

07 avr. 2007, 16:08

Je ne me suis pas vraiment attardé sur les détails, mais je vais t'indiquer une piste de recherche : fonction récursive. Ce que c'est : une fonction qui s'appelle elle-même selon certains critères. C'est préférable à une succesion de boucles imbriquées qui te limitent de toutes les manières au niveau de la profondeur des niveaux.

Explore ça avec attention et reviens éventuellement si tu butes sur une difficulté. Je n'ai pas le code ici, mais j'ai déjà réalisé ce genre de menu... sans limite de profondeur et ça fonctionne très bien.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 177 Messages

07 avr. 2007, 16:26

J'ai volontairement bloquer mon code a trois sous niveau par soucis d'affichage. Ta piste de récursivité est surement une bonne piste pour optimiser la chose mais je pense dans ce cas la etre bloquer au meme probleme la logique de lecture de mon tableau...

Voici mon usine a gaz en sql :
<?
$time_start = getmicrotime();
//affichage des menus
$sql = mysql_query("SELECT id_menu, titre, ordre FROM `menu` WHERE `parent`=0 ORDER BY `ordre` ASC LIMIT 0, 6 ");

while($menu=mysql_fetch_assoc($sql))
	{
		echo"\t<ul>\r";
		echo "\t\t\t<li><a href='#' >(M)".htmlentities($menu[titre])."</a> N°($menu[ordre])\r";
		//article
		$sqlarticle = mysql_query("SELECT `id_article`,`auteur`,`date`,`texte`,`titre`,`date_maj`,`appartenance`,`ordre` FROM `article` WHERE `appartenance`='$menu[id_menu]' ORDER BY `ordre` ASC ");
		if (!mysql_numrows($sqlarticle) == 0 ) echo"\t\t\t\t<ul>\r";
		while($article=mysql_fetch_assoc($sqlarticle))
			{
				echo "\t<li><a href='#' >(A)".htmlentities($article[titre])."</a> N°($menu[ordre].$article[ordre])<br /> ";
			}
			if (!mysql_numrows($sqlarticle) == 0 ) echo"\t\t\t\t</ul> \r";
			
		$sqlsm = mysql_query("SELECT id_menu, parent, titre, ordre FROM `menu` WHERE `parent`='$menu[id_menu]' ORDER BY `ordre` ASC ");
		//sousmenu premier niveau
				if (!mysql_numrows($sqlsm) == 0 ) echo"\t\t\t\t<ul>\r";
		while($sousmenu=mysql_fetch_assoc($sqlsm))
			{
				echo "\t\t<li><a href='#'class='daddy' >(SM)".$sousmenu[titre]."</a> N°($menu[ordre].$sousmenu[ordre])\r";
				//article deuxieme niveau
				$sqlarticle1 = mysql_query("SELECT `id_article`,`auteur`,`date`,`texte`,`titre`,`date_maj`,`appartenance`,`ordre` FROM `article` WHERE `appartenance`='$sousmenu[id_menu]' ORDER BY `ordre` ASC ");
				if (!mysql_numrows($sqlarticle1) == 0 ) echo"\t\t\t<ul>\r";
				while($article1=mysql_fetch_assoc($sqlarticle1))
					{
						echo "\t\t\t<li><a href='#' >(A)".htmlentities($article1[titre])."</a> N°($menu[ordre].$sousmenu[ordre].$article1[ordre]) ";
					}
				if (!mysql_numrows($sqlarticle1) == 0 ) echo"\t\t\t</ul> \r";
				//sousmenu deuxieme niveau
				$sqlssm = mysql_query("SELECT id_menu, parent, titre, ordre FROM `menu` WHERE `parent`='$sousmenu[id_menu]' ORDER BY `ordre` ASC ");
				if (!mysql_numrows($sqlssm) == 0 ) echo"\t\t\t\t<ul>\r";
				while($sous_sousmenu=mysql_fetch_assoc($sqlssm))
					{
						echo "<li><a href='#'class='daddy' >(SSM)".$sous_sousmenu[titre]."</a> N°($menu[ordre].$sousmenu[ordre].$sous_sousmenu[ordre])\r";
						//article troisieme niveau
				$sqlarticle2 = mysql_query("SELECT `id_article`,`auteur`,`date`,`texte`,`titre`,`date_maj`,`appartenance`,`ordre` FROM `article` WHERE `appartenance`='$sous_sousmenu[id_menu]' ORDER BY `ordre` ASC ");
				if (!mysql_numrows($sqlarticle2) == 0 ) echo"\t<ul>\r";
				while($article2=mysql_fetch_assoc($sqlarticle2))
					{
						echo "<li><a href='#' >(A)".htmlentities($article2[titre])."</a> N°($menu[ordre].$sous_sousmenumenu[ordre].$article2[ordre]) ";
					}
				if (!mysql_numrows($sqlarticle2) == 0 ) echo"</ul>\r";	
				
					}
				if (!mysql_numrows($sqlssm) == 0 ) echo"</ul>\r";
				
			}
			if (!mysql_numrows($sqlsm) == 0 ) echo"\t\t\t\t</ul>\r";
		echo"</ul>\r";	
	}
$time_end = getmicrotime();
$time = substr(($time_end - $time_start),0,9);
$message.="<p class='tempgene'>Script droit générée en ".$time." s</p>";

?>
J'en ai deja pas mal sué pour obtenir ce code valide w3c qui me genrer la bonne structure de <ul> et de <li>.
Mais je crois que pour le serveur c'est aussi une grosse usine a gaz mon truc, donc je voulais simplement faire une requette qui me construise le tableau du menu, la sa fonctionne je dirais, mais je ne trouve pas comment faire le lien dans la lecture du tableau entre la cle parent et la cle id_menu...