zwerg: Mehrere Zufallsbilder anzeigen lassen

Glück auf!

Ich lasse zur Zeit auf meiner Homepage mit Hilfe des nachfolgenden Scripts ein Zufallsbild anzeigen.

  
<!-- Zufallsbild -->  
<?php  
//Script für das Zufallsbild  
$bilder = array();  
//Ordner oeffnen  
$dir = opendir ("../ordner/unterordner");  
//Datei lesen ohne die Verzeichnisse darueber  
while ($bild = readdir ($dir)){  
 if ($bild != "." && $bild != ".." && $bild != "Thumbs.db")  
 array_push($bilder,$bild);  
}  
closedir($dir);  
$max = count($bilder)-1;  
$zufall = rand(0,$max);  
$bild = $bilder[$zufall];  
?>  

Nun will ich mir nicht nur ein, sondern mehrere Zufallsbilder anzeigen lassen. Dabei sollen keine Bilder doppelt angezeigt werden. Ich wollte jetzt das Script einfach so erweitern:

  
$bild2 = $bilder[$zufall+1];  
$bild3 = $bilder[$zufall+2];  
... usw. ...  

Aber wenn dann zufällig für $bild1 ein bild am Ende des Arrays ausgewählt wird, gibt es ja möglicherweise die folgenden Bilder garnicht mehr im Array.  Weiß jmd., wie ich das verhindern kann oder hat möglicherweise einen ganz anderen/besseren Ansatz, wie ich mehrere Zufallsbilder anzeigen lassen kann?

Die Bilder liegen übrigens immer in dem gleichen Ordner.

Freundliche Grüße

zwerg Alex

  1. Grüße,
    äre es nciht ienfacher eine if-schleife zu erstellen die den durchlauf wiederhlt falls bild1=bild0

    ODER

    du löschst das ergebniss der ersten "verlosung" aus dem array

    MFG
    bleicher

    --
    __________________________-
    Menschen an sich , sind nicht schlecht - es sind nur ihre Taten (c).
    Lieber bereuen gesündigt zu haben, als nicht sündigen und es später trotzdem bereuen.
    Boccaccio
    1. Glück auf bleicher!

      Vielen Dank für deine Antwort.

      Grüße,
      äre es nciht ienfacher eine if-schleife zu erstellen die den durchlauf wiederhlt falls bild1=bild0

      ODER

      du löschst das ergebniss der ersten "verlosung" aus dem array

      Das sind gleich zwei neue Ansätze für mich. Ich werde mal etwas in diese Richtung probieren.

      Freundliche Grüße

      zwerg Alex

  2. Hallo,

    Ich wollte jetzt das Script einfach so erweitern:

    $bild2 = $bilder[$zufall+1];

    $bild3 = $bilder[$zufall+2];
    ... usw. ...

    
    > Aber wenn dann zufällig für $bild1 ein bild am Ende des Arrays ausgewählt wird, gibt es ja möglicherweise die folgenden Bilder garnicht mehr im Array.  Weiß jmd., wie ich das verhindern kann  
      
    ein Paradebeispiel für den Modulo-Operator!  
      
     ~~~php
    $bild2 = $bilder[($zufall+1) % $max];  
     $bild3 = $bilder[($zufall+2) % $max];
    

    oder hat möglicherweise einen ganz anderen/besseren Ansatz, wie ich mehrere Zufallsbilder anzeigen lassen kann?

    Den Ansatz von bleicher, das benutzte Element aus dem Array zu löschen, finde ich eleganter. Es führt vor allem dazu, dass jedes von mehreren Bildern zufällig ist, während beim obigen Ansatz immer zwei oder drei aufeinanderfolgende Bilder kommen.

    So long,
     Martin

    --
    F: Was ist ekliger als ein angebissener Apfel mit einem Wurm drin?
    A: Ein angebissener Apfel mit einem halben Wurm.
    1. Glück auf Martin!

      ein Paradebeispiel für den Modulo-Operator!

      $bild2 = $bilder[($zufall+1) % $max];

      $bild3 = $bilder[($zufall+2) % $max];

        
      Ich habe das jetzt so wie von dir angegeben [umgesetzt](http://zwergenspiegel.de/community/me.php) und bin mit dem Ergebnis (erstmal) zufrieden, bis ich mich soweit schlau gemacht habe, dass ich Bleichers Idee umsetzen kann und dann auch die Folgebilder "unabhängig" von dem ersten Bild sind.  
        
        
      
      > > oder hat möglicherweise einen ganz anderen/besseren Ansatz, wie ich mehrere Zufallsbilder anzeigen lassen kann?  
      >   
      > Den Ansatz von [bleicher](https://forum.selfhtml.org/?t=165698&m=1080363), das benutzte Element aus dem Array zu löschen, finde ich eleganter. Es führt vor allem dazu, dass jedes von mehreren Bildern zufällig ist, während beim obigen Ansatz immer zwei oder drei aufeinanderfolgende Bilder kommen.  
        
      Danke, dass du trotzdem auch eine vielleicht nicht so ganz schöne, aber eine (für einen "Noob" wie mich) einfache Lösung präsentiert hast.  
        
        
      Freundliche Grüße  
        
      zwerg Alex
      
  3. Glück auf nochmal!

    Ich habe mein Problem nun wie folgt gelöst (für den Fall, das jmd. bei der Suche mal eine ähnliche Lösung benötigt).

      
    <!-- Zufallsbilder -->  
    <?php  
    //Script für die Zufallsbilder  
    $bilder = array();  
    //Ordner oeffnen  
    $dir = opendir ("../bilder/me");  
    //Datei lesen ohne die Verzeichnisse darueber  
    while ($bild = readdir ($dir)){  
     if ($bild != "." && $bild != ".." && $bild != "Thumbs.db")  
     array_push($bilder,$bild);  
    }  
    closedir($dir);  
      
    function gen_zufall($anz,$daten) {  
     for ($x = 0; $x < $anz; $x++) {  
      $i = rand(0, count($daten)-1);  
      $erg[] = $daten[$i];  
      array_splice($daten, $i, 1);  
     }  
     return $erg;  
    }  
      
    $zufalls_array = gen_zufall(10,$bilder);  
    ?>  
    
    

    Bin natürlich weiter für Verbesserungsvorschläge oder Kritik am obigen Code offen. Ansonsten danke an alle, die sich mit meiner Frage beschäftigt haben und insbesondere an Martin und Bleicher, die mir geantwortet haben.

    Freundliche Grüße

    zwerg Alex

  4. echo $begrüßung;

    while ($bild = readdir ($dir)){

    Deine Schleife bricht vorzeitig ab, wenn sie auf eine Datei namens "0" trifft. Beachte die Hinweise im Handbuch zu readdir()

    if ($bild != "." && $bild != ".." && $bild != "Thumbs.db")

    Außerdem findet sie noch genug Dateien, die keine Bilder sind. Beispielsweise .htaccess, falls du die irgendwann mal in dem Verzeichnis benötigen solltest. glob() oder fnmatch() halte ich für geeigneter.

    array_push($bilder,$bild);

    Die Version $bilder[] = $bild; kommt ohne den Overhead eines Funktionsaufrufes aus.

    hat [jemand] möglicherweise einen ganz anderen/besseren Ansatz, wie ich mehrere Zufallsbilder anzeigen lassen kann?

    Schüttel das Array durch und nimm dann die ersten n Einträge. Achte darauf, dass n nicht größer als count() wird.

    echo "$verabschiedung $name";

    1. Glück auf dedlfix!

      Vielen Dank auch an dich, für deine Antwort. Da scheint es ja in der Tat noch einiges an Optimierungsmöglichkeiten zu geben. Ich werde mich morgen mal näher mit deinen Tipps auseinandersetzen. Jetzt gehe ich erstmal in díe Heier und wünsche dir und allen anderen eine gute Nacht.

      Freundliche Grüße

      zwerg Alex

      1. Hallo Dedlfix!

        Ich habe nun "deine Variante" mit dem Shuffle umgesetzt und auch das "array_push($bilder,$bild);" durch $bilder[] = $bild ersetzt.

        Nun ist der Code gleich viel kürzer und übersichtlicher. Deshalb nochmal vielen Dank für deine Hilfe :-)

        Deine anderen Hinweise bzgl. dem readdir() werde ich mir als nächstes mal zu Herzen nehmen. Da immer nur Bilder (ausschließlich jpg) eingelesen werden, gibt es da bestimmt auch noch ne schönere Variante. Also so in der Art "bist du jpg, kommst du hier rein" und nicht so wie jetzt "bist du kein ., kein .., kein Thumbs.db, evtl. noch kein .htaccess und kein bla bla bla, dann darfst du".

        Ahja, aller Anfang ist schwer, aber jetzt werde ich  mich mal wieder der Kosten- und Leistungsrechnung widmen. Meine Pause ist vorbei und das Thema KLR ist auch nicht so ganz unproblematisch :-/