Avatar billede sasso Novice
30. september 2006 - 08:17 Der er 15 kommentarer og
1 løsning

Shuffle-funktionen driller

Hej eksperter

På min hjemmeside (http://www.kraemer.dk) har jeg nogle billeder i et billedarkiv. Hver gang indexsiden loades, skal php vælge to tilfældige (forskellige) billeder til forsiden.

Oprindeligt lavede jeg en løsning, som virkede helt perfekt (bl.a. med ekspertens fine assistance - kan desværre ikke finde det oprindelige spørgsmål og svar).

Nu er der så på et eller andet tidspunkt sket det, at siden ALTID plukker de samme to billeder (med numrene 1 og 2). Derfor har jeg på fornemmelsen, at shufflefunktionen er holdt op med at virke.

Nedenfor står den del af koden, jeg bruger til at vælge de to billeder. Er der nogen, der kan se, hvor det går galt?

--------------------

<?php
$antalpic = 10;
$pic_nr = range(1,$antalpic);
shuffle ($pic_nr);
$pic_nrA = array_shift($pic_nr);
$pic_nrB = array_shift($pic_nr);

echo "<IMG SRC=pic/h/pic";
echo $pic_nrA;
echo ".jpg><br>";

?>

[...]

<?php

echo "<IMG SRC=pic/h/pic";
echo $pic_nrB;
echo ".jpg><br>";

?>
Avatar billede nielle Nybegynder
30. september 2006 - 08:39 #1
Prøv at indsætte denne:

srand((float)microtime() * 1000000);

- lige før at du kalder shuffle().
Avatar billede sasso Novice
30. september 2006 - 09:00 #2
Hej Nielle
Det gør desværre ingen forskel... Andre ideer???
[Du mener sådan her, ikke sandt?:

...
$pic_nr = range(1,$antalpic);
srand((float)microtime() * 1000000);
shuffle ($pic_nr);
...
Avatar billede nielle Nybegynder
30. september 2006 - 09:07 #3
> [Du mener sådan her, ikke sandt?:

Korrekt.

Den linje burde nu heller ikke være nødvendig i nyere versioner af PHP, men man kan jo aldrig vide om det var det der var fejlen.

Det lyder umiddelbart mystisk, og ikke særligt lovende. :^|

Hvad får du ud med denne kode?

$antalpic = 10;
$pic_nr = range(1,$antalpic);
shuffle($pic_nr);
dump_var($pic_nr);
Avatar billede sasso Novice
30. september 2006 - 09:18 #4
Desævrre ikke noget godt:

Fatal error: Call to undefined function: dump_var() in D:\Websider\resadmin\kraemer.dk\kraemer.dk\www\index-pic.php on line 18
Avatar billede nielle Nybegynder
30. september 2006 - 09:25 #5
Min fejl... var_dump() i stedet for dump_var().
Avatar billede hmortensen Nybegynder
30. september 2006 - 09:25 #6
Det er fordi metoden hedder var_dump ;)
Avatar billede sasso Novice
30. september 2006 - 09:44 #7
Så kan jeg bedre forstå, at jeg ikke kunne finde var_dump inde på php.net. :o)

Desværre virker det stadig ikke. Nu lister den bare arrayet før de to (sædvanlige billeder):

array(10) { [0]=> int(2) [1]=> int(1) [2]=> int(6) [3]=> int(5) [4]=> int(3) [5]=> int(8) [6]=> int(4) [7]=> int(7) [8]=> int(10) [9]=> int(9) }

Men det interessante er, at den leverer nøjagtigt det samme array hver gang. Altså, at den ikke shuffler overhovedet. Siger det dig noget.
Avatar billede sasso Novice
30. september 2006 - 09:48 #8
Ups. Pinligt. Det ér jo din mening for at teste, om shuffle overhovedet shuffler...
:o)
Avatar billede nielle Nybegynder
30. september 2006 - 09:58 #9
:^)

Umiddelbart ser det jo ud til at shuffle() faktisk blander arrayet, men at det af en eller anden grund blander til det samme hver gang. Altså hvis jeg skal forstå det sådan at du får eksakt det nedstående *hver* gang (force reload med Ctrl+F5)?

array(10) { [0]=> int(2) [1]=> int(1) [2]=> int(6) [3]=> int(5) [4]=> int(3) [5]=> int(8) [6]=> int(4) [7]=> int(7) [8]=> int(10) [9]=> int(9) }

Jeg formoder at du så også får det sammen, hvis du har srand() linjen med?
Avatar billede sasso Novice
30. september 2006 - 10:05 #10
jeps... Desværre...
Avatar billede sasso Novice
30. september 2006 - 10:06 #11
Hvis du går ind på siden, kan du selv se det nu...
Avatar billede nielle Nybegynder
30. september 2006 - 10:14 #12
Hmmm... det virker godt nok som om at der er noget seriøst galt.

Jeg er dog ikke sikker på at det nødvendigvis er shuffle() som er syg. En anden kandidat er hele random-genererings mekanikken.

For at undersøge det kan du f.eks. prøve med:

  srand((float)microtime() * 1000000);
  echo rand(0, 20) . ", ";
  echo rand(0, 20) . ", ";
  echo rand(0, 20) . ", ";
  echo rand(0, 20) . ", ";
  echo rand(0, 20);

Giver dette den samme række tal hver gang du reloader?
Avatar billede sasso Novice
30. september 2006 - 10:18 #13
Nix, det virker helt upåklageligt... (se selv nu)
Avatar billede nielle Nybegynder
30. september 2006 - 10:20 #14
Hmm, så ser det vitterligt ud til at shuffle *er* syg på en eller anden måde.

Som et muligt alternativ kan du bruge denne her i stedet:

http://dk2.php.net/manual/da/function.array-rand.php
Avatar billede sasso Novice
30. september 2006 - 11:05 #15
Fantastisk. Det virkede. Skulle bare lige bruge lidt tid på at finde ud af, hvordan jeg kaldte det ordentligt. :o) Løsningen blev sådan her:

$antalpic = 10;
$pic_nr = range(1,$antalpic);
srand((float) microtime() * 10000000);
$rand_keys = array_rand($pic_nr, 2);

echo "<IMG SRC=pic/h/pic";
echo $pic_nr[$rand_keys[0]];
echo ".jpg><br>";

echo "<IMG SRC=pic/h/pic";
echo $pic_nr[$rand_keys[1]];
echo ".jpg><br>";

Det kan ses på http://www.kraemer.dk.

Smider du ikke lige et svar, så jeg kan acceptere? Tusind tak for tålmodig og god hjælp. :o)

(Har du for resten nogen som helst idé om, hvor shuffle-funktionen kan være syg? Er det hos mig, hos min udbyder eller hva'? Er der noget, man bør gøre ved det?)
Avatar billede nielle Nybegynder
30. september 2006 - 11:10 #16
Ingen anelse. Din kode ser ok ud, så jeg vil gætte på at det er PHP installationen som er lettere itu på en eller anden måde.

... og et svar :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester