Generer images aleatoire sans repetion

Discussion dans 'Web, design' créé par WaKaaN, 1 Mai 2007.

Statut de la discussion:
Fermée.
  1. Offline
    WaKaaN JcQL
    Bonsoir a tous !

    Voila mon soucis algorithmique...
    J'ai cree une page generant des images aleatoirement pris dans un dossier.

    Ca marche nickel, seulement avec mon algo, la page affiche parfois 2 fois la meme image... ce qui est normal vu comment je lai implemente..

    Donc siouplait, qqun aurait-il de l'inspiration pour eviter les repetitions ?

    Code:
     
    function show($TYPE,$WIDTH,$HEIGHT) {
    	     $PATH = "Test/".$TYPE."/";
    
     	     $dir=opendir($PATH); 
    	     $i=1; 
    	     while($file=readdir($dir))  { 
         		if ($file != "." && $file!="..")   { 
            	                         $Array[$i]=$file; 
            	                         $i++; 
                                    } 
    	        } 
    		
    	     closedir($dir); 
    
    	     $rand=mt_rand(1,count($Array));     
    	     $URL = "http://".$Array[$rand];
    	     $PATH = $PATH.$Array[$rand];	
        	     
                         echo "<a href=\"$URL\" target=_new><img border=\"0\" src=\"$PATH\" width=\"$WIDTH\" height=\"$HEIGHT\"></a> "; 
    	      
    }
    
    


    Mon appel de fonction
    Code:
    show("images","200","200");
    

    Merci beaucoup !!


    EDIT : Petite precision : La difficulte de la chose est que les appels de methode sont situes a differents endroit et qu'il faudrait donc utilise une variable global afin qu'apres un appel de methode, l'image choisie soit stockee et verifie dans la fonction show()...
    WaKaaN, 1 Mai 2007
    #1
  2. Offline
    guslinux Gamerz'ien
    En MySQL il y a la possibilité "ORDER BY Rand()"
    guslinux, 1 Mai 2007
    #2
  3. Offline
    WaKaaN JcQL
    Je prefererais utiliser une methode sans passer par le MySQL... Mais si aucune autre solution ne se montre a moi, alors j'approfondirais le "ORDER BY Rand()"....
    WaKaaN, 1 Mai 2007
    #3
  4. Offline
    neku Codeur roumain
    il y a plusieur solution mais tu aura besoin d'une variable global.

    Ce que je te propose c'est de faire une fonction qui genere ton tableau $Array et de la retourne le tableau.

    Apres tu utilise ta fonction show mais avec un parametre dans lequel tu passe ton tableau creer précédement.
    Lorsque tu as faire ton rand tu remplace la valeur du tableau a la position obtenue par le rand par NULL.
    et donc tu ajoute a ta fonction show un test, apres avoir obtenu le ran, tu test simplement si le contenu = NULL si oui tu refait un rand sinon tu affiche.
    Code:
    while ($Tableau[$rand=mt_rand(1,count($Tableau))] == NULL);
    Code:
    function CreateArray ($Type) {		 
    	$PATH = "Test/".$TYPE."/";
    	$dir=opendir($PATH); 
    	$i=1; 
    	while($file=readdir($dir)  )  { 
    		if ($file != "." && $file!="..")   { 
    			$Array[$i]=$file; 
    				$i++; 
    		} 
    	} 
    		
    	closedir($dir);
    	return $Array;
    }
    
    function Show($Array, $WIDTH, $HEIGHT) {
    	while ($Array[$rand=mt_rand(1,count($Array))] == NULL);
    	$URL = "http://".$Array[$rand];
    	$PATH = $PATH.$Array[$rand];	
    	echo "<a href=\"$URL\" target=_new><img border=\"0\" src=\"$PATH\" width=\"$WIDTH\" height=\"$HEIGHT\"></a> ";
    	$Array[$rand] = NULL;
    	return $Array;
    }
    
    Voila, maintenant fais attention ce morceau de code ne vérifie pas si tu appel la fonction Show alors que toutes les entrées du tableau sont à NULL.
    Si c'est le cas la fonction bouclera à l'infinit.
    neku, 1 Mai 2007
    #4
  5. Offline
    whatever42 ex membre
    tu génères ton tableau de fichiers image,
    comme l'a dit guslinux, tu le tries avec une fonction qui renvoie une valeur aléatoire,
    et après tu prends autant d'images que t'as besoin puisées dans ton tableau ordonné aléatoirement,
    et pas besoin de SQL

    http://www.manuelphp.com/php/function.usort.php
    whatever42, 2 Mai 2007
    #5
  6. Offline
    WaKaaN JcQL
    Ca a lair detre EXACTEMENT ce que je cherchais !!

    Un Merci GEANT... Je teste, et je reviendrais surement poser qques questions dapprofondissement !
    WaKaaN, 2 Mai 2007
    #6
Statut de la discussion:
Fermée.