Problème avec array_rand

Problème avec array_rand - PHP - Programmation

Marsh Posté le 05-04-2007 à 15:21:13    

Bonjour,
 
J'aimerai avoir votre aide, s'il vous plais.
 
Je souhaite crée une galerie photo, avec des images aléatoires mais qui soit affiché une seule fois.
 
J'ai donc écris ça :
 

Code :
  1. $nbimages =100;
  2. $i=0;
  3. $input = array ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "100" );
  4. $rand_keys = array_rand ($input, $nbimages);
  5. while($i != $nbimages)
  6.     {
  7.     echo '<img src="photo';
  8.     print $a =$input[$rand_keys[$i]];
  9.     echo '.jpg">',"\n";
  10.     $i++;
  11.     }


 
Ça marche super bien ..... Mais Ça marche que pour 100 photos dans la galerie.  
 
Si j'ai 400 photos je ne vais pas écrier 1 2 3 4 .... jusqu'a 400.  
J'ai aussi cherché et j'ai toujours trouvé une variable dans la quel il faut définir tt les nombre du tableaux à la main.  
Je souhaite donc remplacé ces nombres par une variable..... mais je n'y arrive pas, j'ai essayer tt plein de truc, et j'obtiens souvent cela  
 
Parse error: parse error, unexpected T_LNUMBER, expecting T_VARIABLE or '$' in http://www.mon_domaine.com/dev/index.php on line 4
 
Je ne sais pas s'il existe une autre méthode.
 
Je vous remercie par avance de votre aide.

Reply

Marsh Posté le 05-04-2007 à 15:21:13   

Reply

Marsh Posté le 05-04-2007 à 15:44:47    

[:pingouino]  
Déjà, je comprends pas ce que t'essaies de faire. En gros là tu lui demandes de te sélectionner aléatoirement 100 nombres parmi 101. [:pingouino]  
 
Ensuite, effectivement, tu vas pas te taper tout le tableau a la main, t'as http://fr.php.net/range pour ça... mais ça oblige à construire un tableau assez énorme. L'autre solution c'est d'utiliser mt_rand autant de fois que nécessaire en stockant les valeurs déjà trouvées pour éviter de retomber sur la même.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 05-04-2007 à 15:52:57    

sielfried a écrit :

Ensuite, effectivement, tu vas pas te taper tout le tableau a la main, t'as http://fr.php.net/range pour ça... mais ça oblige à construire un tableau assez énorme. L'autre solution c'est d'utiliser mt_rand autant de fois que nécessaire en stockant les valeurs déjà trouvées pour éviter de retomber sur la même.


Je conseillerais quand même de passer par range plutôt que des mt_rand à répétition:

 
  • Même si génère un tableau de taille 10000, ça ne prend pas une place si énorme
  • Le code est beaucoup plus clair (l'intention est clairement exprimée), donc plus facile à comprendre pour le maintenir
  • Le code est infiniment plus simple (pas de stockage de valeurs intermédiaires, pas de modifications d'arrays existants, pas de conditionnels, ...)


Donc imo passer par range + array_rand dans un premier temps, ensuite si les perfs sont insuffisante ou la consommation de mémoire est trop grande vérifier si le problème vient de là et réimplémenter le truc via mt_rand si c'est le cas (et que mt_rand améliore les perfs)


Message édité par masklinn le 05-04-2007 à 15:53:16

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 05-04-2007 à 16:00:33    

Reply

Marsh Posté le 05-04-2007 à 17:08:53    

Merci pour vos réponses mais je n'y trouve pourtant pas la solution que j'espérais, j'ai du mal m'exprimer.
 
 
Comme je peux déclarer un tableau avec une dimension variable car je peux avoir besoin d'un tableau avec 10 valeurs auquel cas je peux les écrire dans le code, mais je peux aussi avoir besoin avec le même tableau de 5 000 valeurs et je ne pourrai certainement pas les écrire toutes.
 
Quel est la syntaxe la mieux adaptée à mon souci de tableau de grande dimentions.
 
Est ce que je ne pourrais pas mettre une variable a la place example !
 

Code :
  1. $valeur =' "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "100" ';
  2. $input = array ($valeur);


 
Ou encore mettre un écart de valeurs exemple !  

Code :
  1. $valeur =['0-5000'];
  2. $input = array ($valeur);


 
 

Reply

Marsh Posté le 05-04-2007 à 17:12:31    

tu es sûr d'avoir lu la première réponse de sielfried ?

Reply

Marsh Posté le 05-04-2007 à 18:21:37    

J'ai bien lu la réponse de sielfried.  
 
J'ai essayé différantes choses, dont une qui me donne une chaine de chiffre 012345678910. Et lorsque je donne cette dernière à la fonction aléatoire j'ai de nouveau une erreure.
 
Il est vrais que certaines choses expliquée dans cette page d'aide sont pour moi obscures, c'est pour cette raison que j'ai ajouté une nouvelle réponse.
 
 
En fait j'ai une fonction qui me calcule le nombdre de photos que j'ai dans un dossier et qui me retourne donc une valeur et je souhaiterais utiliser cette même valeur dans ma fonction aléatoire afin d'automatiser complètement mon script.
 
 

Reply

Marsh Posté le 05-04-2007 à 18:33:46    

Citation :


$valeur =['0-5000'];
$input = array ($valeur);


 
Si t'avais lu un minimum le lien que j'ai donné sur range, tu te demanderais pas comment faire ça...


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 05-04-2007 à 18:54:15    

J'ai lu la page et j'ai réussi à faire des écarts de 0-5000 sans soucis :) Je te remercie.  
 
Mais comme je le disais dans mon dernier poste je n'arrive pas à donner cette chaine générées.  
 

Code :
  1. foreach(range(0,5000) as $number) {
  2.     echo $number;
  3. }
  4. $rand_keys = array_rand ($number, $nbimages);


j'ai bien mon écart mais là j'ai une erreur a la ligne 4 car array_rand ne supporte visiblement pas une chaine 012345678901112131415161718......49995000.  
 
Après comme je le disais aussi dans mon poste précédant je n'ai pas compris tt les exemples, c'est pour cette raison que je vous redemande de l'aide.
 
 
Merci par avance

Reply

Marsh Posté le 05-04-2007 à 18:58:43    

gabgab a écrit :

Code :
  1. foreach(range(0,5000) as $number) {
  2.    echo $number;
  3. }



 [:lacuna coil]  
 
C'est n'importe quoi, là tu donnes à "$number" les valeurs 0, puis 1, puis 2, ... 5000
 
Donc quand tu sors de ton foreach $number est un entier contenant le nombre 5000, pas un array [:jofission]  
 
C'est quand même pas compliqué de réfléchir 3 secondes si? [:bbcmoi]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 05-04-2007 à 18:58:43   

Reply

Marsh Posté le 05-04-2007 à 19:46:35    

J'ai bien vu que je donnais les valeurs 0, puis 1, puis 2 jusqu'a 5000. (c'est ce que je dis plus haut 012345678901112131415161718......49995000)
 
Mais je n'arrive pas à faire autrement.  
 
Je te demande de bien vouloir m'aide s'il te plais, car j'ai l'impressions que tu sais le faire et moi non je n'y arrive pas.
 
 
Merci par avance.

Reply

Marsh Posté le 05-04-2007 à 19:56:36    

Heuuu c'est pas très compliqué hein [:bertie wooster]  
 
range() renvoie un array, tu colles ton array dans une variable au lieu d'itérer dessus (j'veux dire quand tu vois des docs sur PHP.net t'es censé les comprendre pas les recopier telles quelles et te plaindre que ça fonctionne pas  [:petrus75]  [:bertie wooster]  [:chrisbk]  [:darksamus]  [:petrus jar] )
 
Et ensuite tu files ton array à array_rand [:doc petrus]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed