boucle + regex

Petit nouveau ! | 1 Messages

30 août 2009, 10:56

Bonjour,

Je galère pour arriver à mettre en place l'algorythme suivant :

"tant que le dossier ne comporte pas la chaine "11-" (suivi de lettre(s) en majuscule(s)), recommencer la génération de l'image aléatoire".

Ca semble tellement simple quand c'est écrit comme ça…

Voici le bout de code, je pense que le regex est bon, et quand le dossier est 11-A ou 11-GH, ça fonctionne correctement, par contre, si le dossier est 12-F ou 12 RT, ça ne fonctionne plus et aucune image ne s'affiche.
			// CHOIX DE L'IMAGE ALÉATOIRE
				$root = "data";
				$folder = scandir($root);
				$folder = array_diff($folder, array(".", "..",));
				$fo = array_rand($folder);
				$root = "data/$folder[$fo]";
				
				if (preg_match("#11-[A-Z]#", $root)){
					$file = glob("$root/*.jpg", GLOB_BRACE);
					$fi = array_rand($file);
					}
				else {
					while ((preg_match("#11-[A-Z]#", $root))=== false){
						$root = "data";
						$folder = scandir($root);
						$folder = array_diff($folder, array(".", "..",));
						$fo = array_rand($folder);
						$root = "data/$folder[$fo]";
						$file = glob("$root/*.jpg", GLOB_BRACE);
						$fi = array_rand($file);
					}}
Si une âme charitable pouvait m'aider.

Merci :D

Eléphant du PHP | 369 Messages

30 août 2009, 11:55

Bonjour,
Je galère pour arriver à mettre en place l'algorythme suivant :
"tant que le dossier ne comporte pas la chaine "11-" (suivi de lettre(s) en majuscule(s)),
recommencer la génération de l'image aléatoire".
Ca semble tellement simple quand c'est écrit comme ça…
Voici le bout de code, je pense que le regex est bon, et quand le dossier est 11-A ou 11-GH, ça
fonctionne correctement, par contre, si le dossier est 12-F ou 12 RT, ça ne fonctionne plus et
aucune image ne s'affiche.
// CHOIX DE L'IMAGE ALÉATOIRE

$root = "data";
$folder = scandir($root);
$folder = array_diff($folder, array(".", "..",));
$fo = array_rand($folder);
$root = "data/$folder[$fo]";
				
if (preg_match("#11-[A-Z]#", $root))
{
   $file = glob("$root/*.jpg", GLOB_BRACE);
   $fi = array_rand($file);
}
else
{
   [>>>]while ((preg_match("#11-[A-Z]#", $root)) === false)
   {
      $root = "data";
      $folder = scandir($root);
      $folder = array_diff($folder, array(".", "..",));
      $fo = array_rand($folder);
      $root = "data/$folder[$fo]";
      $file = glob("$root/*.jpg", GLOB_BRACE);
      $fi = array_rand($file);
   }
}
Si une âme charitable pouvait m'aider.
Merci :D
Un point qui me choque, faut pas m'en vouloir hein, c'est juste que l'habitude perso
diffère de celle des autres. Donc, le point (!) est celui-ci:

Pourquoi 2 boucles alors qu'une seule peut suffire?
$bfWork = true;
$match   = "";

while($bfWork)
{
   $pattern = "#11-[A-Z]#";
   if (preg_match($pattern, $root, $match) == 0) 
   {
      // Nouvelle assignation de $root
      // Tu peux même associer : if (!file_exists($root)) ...
      // .
      // .
      // .
   }
   else $bfWork = false;
}
Pour ta pattern de recherche, j'ai testé elle marche. En revanche j'ai remarqué une erreur ici:
preg_match renvoie un integer et non un boolean donc ton test sera toujours faux.
[>>>] while ((preg_match("#11-[A-Z]#", $root)) === false)
// Replace par
while((preg_match("#11-[A-Z]#", $root)) == 0)

Je te conseille aussi de ne pas évaluer toutes tes chaines comme tu le fais:
$fo = array_rand($folder);
$root = "data/$folder[$fo]";
			
// La simplicité est préférable

$root = "data/".$folder[array_rand($folder)];
J'espere avoir résolu ton problème. Ce que j'ai dis/donné comme infos en sus prend les pour ce que ca vaut,
hein, je me suis juste permis de t'indiquer une manière plus simple d'arriver au bout alors m'en veux pas et
à toi de jouer ;)

@+ ;)