[php] Random image, alleen jpg, zonder dubbele

Pagina: 1
Acties:
  • 114 views sinds 30-01-2008

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hi Folks, hier heb ik een scriptje voor het tonen van een random image. Dat werkt allemaal geweldig, alleen ik wil eigenlijk 8 images horizontaal op een rij plaatsen. En nog belangrijker zonder dubbele images! Op zich werkt het allemaal goed, alleen krijg ik een foutmelding en duurt het erg lang voordat ie iets laat zien. De foutmelding geeft aan dat er een fout zit in de volgende regel:

Fatal error: Maximum execution time of 30 seconds exceeded in header_random.php on line 30
print( "<td>[img]\"images/"[/img]</td>" );

Misschien kunnen jullie me verder op weg helpen? Ik ben newbee en inmiddels al een tijdje op zoek.

Thanks!

<?
$handle = opendir( "/usr/local/slash/apache/vhosts/blablabla/httpdocs/dynamic/images" );
$imgArray = array( );

while( $file = readdir( $handle ) ) {
if( $file != "." && $file != ".." ) {
array_push( $imgArray, $file );
}
}
closedir( $handle );

mt_srand( (double)microtime( ) * 1000000 );

echo "<table border=\"0\"><tr>";

$images = array();

$x = 0;
while ($x <= 8) {

$randval = mt_rand( 0, sizeof( $imgArray ) - 1 );

if (!in_array($randval,$images)) {
if (substr($imgArray[$randval],-4) == ".jpg") {
print( "<td>[img]\"images/"[/img]</td>" );
$images[] = $randval;
$x++;
}
}

}

echo "</tr></table>";
?>

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 03-02 23:18

D2k

je lussen kloppen blijkbaar niet
die warning geeft aan dat je script er telang over doet

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 18-08 17:53

Janoz

Moderator Devschuur®

!litemod

Hoeveel plaatjes zitten er in de dir? Het kan mischien heel lang duren voordat het script bij het laatste plaatje uberhaupt nog 1 van de overgebleven plaatjes gegokt heeft? Mischien kun je beter bij het inlezen van de array alvast filteren op .jpg, en vervolgens gewoon de array 'door elkaar schudden' (is een functie voor, en je weet vast wel waar je die kunt vinden) en vervolgens gewoon de eerste 8 te nemen....

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 03-02 23:18

D2k

bekijk oa dit topic eens: [topic=167941]

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • Grum
  • Registratie: Juni 2001
  • Niet online
www.php.net/array_rand

en aub niet de code uit dat oude topic nemen - dat is brak (ookal isset mijn code :D)

[goede bui mode]
code:
1
2
3
4
5
6
7
8
9
10
$theList = array();
while($tmpFile = readdir($theHandle))
   if($tmpFile != '.' && $tmpFile != '..')
    $theList[] = $tmpFile;
 
srand ((float) microtime() * 10000000);
$theRandomList = array_rand(array_flip($theList), 8);

foreach($theList as $theImage)
    ; // do something with '$theImage'

hiermee moet je et wel kunnen :P

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
OK thanks voor je oplossing! Maar hoe moet ik dat dan precies verwerken in de bestaande code die hier bovenaan staat?

I'm a newbie, you know...

Acties:
  • 0 Henk 'm!

  • Grum
  • Registratie: Juni 2001
  • Niet online
scriptrequest in het kwadraat nu

als je het niet kan oplossen met mijn code .. dan heb je hier weinig te zoeken ... ik raad je aan om even een stapel tutorials door te nemen.

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Grum:
if($tmpFile != '.' && $tmpFile != '..')
if ( is_file ( $tmpFile ) && preg_match ( "/(\.jpg)|(\.jpeg)|(\.jpe)$/", $tmpFile ) )

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Grum
  • Registratie: Juni 2001
  • Niet online
en dan de regexp aub zo:


/\.jp(g|eg|e)$/ ipv /(\.jpg)|(\.jpeg)|(\.jpe)$/

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Student, met de huidige hints moet het toch wel gewoon lukken :?

Je hebt 20 regels code en daar moet je toch met gemak kleine aanpassingen aan kunnen maken, zoals bijvoorbeeld grum en drm die voorstellen.

Acties:
  • 0 Henk 'm!

Verwijderd

Voordat ik de handige functie in_array() en order by Rand() ontdekte heb ik er wel eens een functie voorgemaakt. Het is zeer oude code en waarschijnlijk tamelijk slecht gecode, maar het werkt wel.
code:
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
      // Deze functie haalt random $number waarden uit een array
      function RandomValues($array_input, $number = 3)
      {
            // Wanneer $number te groot is overschrijven we het met de maximale waarde
            $max = count($array_input) < $number ? count($array_input) : $number;

            for($i = 0; $i < $max; $i++)
            {
                // Genereer de $rv (= random value)
                srand((double)microtime() * 1000000);
                $rv = rand(0, count($array_input) - 1);

                // Eerste meteen toevoegen
                if(count($result) == 0)
                      $result[] = $array_input[$rv];
                else
                {
                      $allow = true;
                      // Doorloop de array op zoek naar dubbele waarden
                      for($j = 0; $j < count($result); $j++)
                      {
                            // Dubbele waarde gevonden
                            if($result[$j] == $array_input[$rv])
                            {
                                $allow = false;
                                $i--;
                                break;
                            }
                      }
                      // Geen dubbele waarde gevonden, toevoegen dus
                      if($allow)
                            $result[] = $array_input[$rv];
                }
            }
            return $result;
      }

Vul dus je array met de filesnames van de plaatjes en dan moet het werken

Acties:
  • 0 Henk 'm!

  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06 10:52
Op vrijdag 29 maart 2002 13:36 schreef Grum het volgende:
en dan de regexp aub zo:


/\.jp(g|eg|e)$/ ipv /(\.jpg)|(\.jpeg)|(\.jpe)$/
Waarom? Ik vind die andere persoonlijk duidelijker en hij is op een eenduidige manier uitbreidbaar. Als je die van jouw wilt uitbreiden met b.v. .bmp zul je alsnog die andere constructie moeten gebruiken, dan kun je dat beter van begin af aan doen, voor de duidelijkheid.

Kortom, er is m.i. niets dat jouw regexp beter maakt dan die van hem.

He who knows only his own side of the case knows little of that.


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

RickN:
Waarom? Ik vind die andere persoonlijk duidelijker en hij is op een eenduidige manier uitbreidbaar. Als je die van jouw wilt uitbreiden met b.v. .bmp zul je alsnog die andere constructie moeten gebruiken, dan kun je dat beter van begin af aan doen, voor de duidelijkheid.

Kortom, er is m.i. niets dat jouw regexp beter maakt dan die van hem.
chapeau

edit:
sterker nog, ik zou die extensies eerder in een array zetten, en mbv. implode () en preg_quote () de regex construeren.
</muggenzifterij>

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt, daar heb ik tenminste wat aan...

Acties:
  • 0 Henk 'm!

  • Grum
  • Registratie: Juni 2001
  • Niet online
Op vrijdag 29 maart 2002 13:39 schreef Nokia een enorm brok slome code
ARRAY_RAND

ARGH

tjeez mensen ....
code:
1
$theRandomList = array_rand(array_flip($theList), 8);

hoe simpel wil je het hebben ?????

dit pakt 8 random items uit '$theList' en stopt ze in '$theRandomList'

|:(

Acties:
  • 0 Henk 'm!

Verwijderd

Grum, ik zeg het er toch bij. Tuurlijk zijn er betere oplossingen, maar het ging alleen even om het principe. Mocht je een taal voor je kiezen krijgen die al die geweldige array functies niet mocht bevatten.

Btw, volgens heb ik je een keertje gezien op de verjaardag van Stas....

Acties:
  • 0 Henk 'm!

  • Grum
  • Registratie: Juni 2001
  • Niet online
offtopic:
Aan je profile te zien woon je in z'n geboorte plaats dus zou best kunnen :)


maar als je nou de topicposter's reactie leest:
Bedankt, daar heb ik tenminste wat aan...
dan weet je toch al dattie de foute code gaat gebruiken ?

en dat is waar ik giftig van word :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Heb nu aardig wat suggesties gekregen, maar welke kan ik nu het beste gebruiken zonder de bestaande code rigoreus om te hoeven gooien?

Help me out here?
Ben al bezig met php, maar kan altijd beter...

Acties:
  • 0 Henk 'm!

  • Grum
  • Registratie: Juni 2001
  • Niet online
heb je mijn post uberhaubt wel gelezen ofniet ?

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Mja, als je niet wilt lezen doe je dat niet.

maar blijf dan niet doorzeuren om nog meer hulp.
Pagina: 1

Dit topic is gesloten.