Bonjour,

Je suis nouveau sur le forum, je pose cette question dans la section débutant.
Voilà, en cours, j'ai créé il y a un peu de temps un site web dynamique en PHP. N'étant pas de section informatique (Licence flux numériques), nous n'avons que survolé quelques fonctions.

Mon problème est sans doute très simple à résoudre :

J'ai un menu horizontal dynamique : lorsque je créé un dossier à la racine de mon site, cela créé
menu directement dans mon site. Un sous-dossier -> un sous-menu.

Les menus et sous-menus sont triés par défaut par ordre alphabétique, mais je n'ai rien fait de tri particulier.

J'aimerai juste trier mes menus et sous-menus comme je l'entends. Peut-être il sera nécessaire de complexifier mon code pour attribuer un numéro à chaque menu ou sous-menu, je ne sais pas.

Quelqu'un peut m'aider ?

Cordialement.

Voici le code de mon menu :

   <div id="menuH">
<?php
if (@$_GET['page'] == '') $courant='class="courant"';
else $courant='';
?>
	<a href="<?= $_SERVER['PHP_SELF'] ?>" <?= $courant ?> >home</a>
<?php
$dir = './';
if (is_dir($dir)) {
	if ($dh = opendir($dir)) {
		while (($file = readdir($dh)) !== FALSE) {
			if( (substr($file, 0, 1) != '.') && (substr($file, 0, 1) != '_') && is_dir($file) /*&& !in_array($file, array ('Templates', 'Correction'))*/ ) {
//			if( is_dir($file) && !in_array(substr($file, 0, 1), array ('.', '_')) ) ---> contraction
				if (substr(@$_GET['page'], 0, strpos(@$_GET['page'], '/')) == $file)  $courant = 'class="courant"';
/**
 * VB : correction de la ligne {  echo $courant='';  }  : remplacement du "echo" par "else" : { }
**/
				//echo $courant='';
				else $courant='';
				echo "\n\t" .'<a href="?page='.$file.'/" '.$courant.'>'.$file.'</a>';
			    echo '<!--'.@$_GET['page'].' - '.(substr(@$_GET['page'], 0, strpos(@$_GET['page'], '/')))
			          .((substr(@$_GET['page'], 0, strpos(@$_GET['page'], '/')) == $file)?' est égal à ':' n\'est pas égal à ')
			          .$file .'-->';
			
			} // fin du if compliqué
		} // fin du while
	} // fin du if $dh=...
} // fin du if is_dir
?>	

   </div>
Salut,

Donc code est quand même un peu moche Smiley lol .
Le commentaire pour dire une correction est un peu inutile. Que-veux dire VB ?

Alors quelque points sur le code lui même :
- Pour récupérer 1 caractère d'une chaîne mieux vaut passer par les crochets que substr() (plus rapide, plus clair et concis Smiley smile )
substr($file, 0, 1);
//devient
$file[0];

- Utilise des variables pour enregistrer les opérations faites plusieurs fois. Il y a pas moins de 3 `substr(@$_GET['page'], 0, strpos(@$_GET['page'], '/'))`
- N'utilise pas @ mais fait une véritable vérification. Pour savoir si la clef d'un tableau existe, il y a isset.
- Utilise <?php pour commencer un code php, les raccourcie comme <?= peuvent ne pas fonctionner sur certaine configuration.
- Faudrait vérifier la valeur $_GET['page'], tu peux avoir des surprises et ouvrir de grande faille de sécurité selon comment tu l'utilises.


Sinon, le trie effectué est dû à opendir() et readdir() qui -si je me souvient- bien trie par ordre alphabétique.
Le mieux serait de mettre dans un tableau les menus tu veux afficher. Ainsi, tu trie ton tableau comme tu l'entends et limite aux dossiers voulut.
 
foreach ($name as array('menu1', 'menu2')) {
	//affiche $name…
}

Par contre, on perd le côté dynamique.
Pour le gardé, il faut récupéré tout les menu dans un tableau (au lieu de les afficher) on filtrant sur les dossiers que tu veux trier. Ainsi, tu as 2 tableaux, un crée toi même contenant les dossier trier et un autre remplit par t'as boucle contenant les dossier que tu n'avais pas indiquer. Suffit après de les merger (array_merge) et d'afficher.