Mehrere Zufallsbilder anzeigen lassen
zwerg
- php
1 bleicher0 zwerg
1 Der Martin0 zwerg
0 Danke, mir wurde geholfen :-)
zwerg1 dedlfix0 zwerg
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
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
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=bild0ODER
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
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
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
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
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";
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
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 :-/