How-To: Zufälliges Bild anzeigen (Teil 1: Ein Ordner)

15. September 2007

In mehreren Webforen kam las ich schon öfters die Frage: Wie kann ich ein zufälliges Bild in meine Webseite einbinden?
Für diese Frage gibt es mehrere Möglichkeiten die von der Situation abhängen, z.B. ob man nur einen oder mehrere Ordner hat mit Bilder oder die Quelle eine Datenbank ist. In diesem Artikel wird die Methode mit einem Ordner erklärt, anderes Folgt.

Die Situation: Wir haben ein Verzeichnis in dem sich Bilder in einem oder mehreren Formaten befinden und wir eines von dieses zufällig anzeigen möchten. Dazu müssen wir zuerst das gesamte Verzeichnis einlesen und ein zufälliges Bild heraussuchen.

Das ist der einfachste Fall, wir brauchen nur ein Verzeichnis auszulesen und dann daraus ein zufälliges Bild ermitteln:

1
2
3
4
5
6
7
8
9
// Zuerst einmal den Pfad herausfinden
$path = dirname(__FILE__) . '/bilder/';
 
// Verzeichnis öffnen
$dir = opendir($path) or die('Konnte Ordner nicht öffnen :-(');
 
// Und auslesen sowie in ein Array schreiben
while ( ( $file = readdir($dir) ) !== false )
{

Ich mach hier eine kurze Pause um etwas tiefer zu erklären. Von dem meisten wird bei readdir() diese Zeile benutzt:

while ( $dir = readdir($dir) )

Das funktioniert prima, hat aber ein Problem. Was ist, wenn eine Datei z.B. “0″ heißt? Dann wird das Ergebnis innerhalb der Klammern false und die Schleife bricht ab, selbst wenn noch Dateien fehlen. Daher sollte man dies umgehen. Die Operatoren === und !== (das Gegenteil) prüfen nur boolsche Werte, die Schleife wird also erst abgebrochen wenn readdir wirklich fertig ist. ;)

Als nächstes müssen wir prüfen, ob die Datei die wir gerade bekommen haben auch wirklich interessant ist für uns. Zuerst einmal die beiden virtuellen Verzeichnisse ‘.’ und ‘..’ ausfiltern, außerdem ob wir von readdir eine Datei oder ein Verzeichnis bekommen haben (Prüfung mit is_file()).

1
2
	if ( $file != '.' && $file != '..'  && is_file($path . $file))
	{

Gut, wir haben alle Dateien in dem Ordner, aber sind das auch alles Bilddateien? Das sollte auch noch geprüft werden. Dazu erstellen wir zuerst ein Array mit den erlaubten Endungen und fügen dies in den Skriptkopf oder vor die while-Schleife ein:

1
2
// Welche Erweiterungen sind erlaubt?
$extensions = array('jpg', 'png', 'gif');

Und als nächstes die Prüfung in der Schleife.

1
2
3
		$ext = substr($file, -3, 3);
		if ( in_array(strtolower($ext), $extensions) )
		{

Diese Zeilen sehen kompliziert aus, ist aber recht einfach. Zuerst ermitteln wir mit substr()die Dateiendung und schreiben in die Variable $ext. Im nächsten Schritt wird diese in Kleinbuchstaben umgewandelt und geprüft ob diese im Array $extensions ist.
Wieso klein? Ganz einfach: Was ist, wenn die Dateiendung groß ist, wie es z.B. MS Paint gerne macht? Dann würde das Bild durchfallen, ist aber nicht der Sinn der Sache.

Jetzt noch das Bild in das Bilderarray speichern und alle geöffneten Codeblöcke wieder schön zu machen. ;)

$pics[] = $file;

Jetzt noch eine Prüfung ob wir überhaupt Bilder im Ordner haben, dann kann es losgehen. Dazu einfach mit empty() schauen, ob in dem Array etwas drin ist:

1
2
if ( !empty($pics) )
{

Jetzt kommt erst der interessante Teil: die Auswahl. Zuerst einmal brauchen wir die Anzahl der Elemente im Array. Da ein Array aber bei der Indexierung mit 0 anfängt und die Zählung mit 1, müssen wir davon 1 abziehen.

$count = count($pics) - 1;

Als nächstes das spannendste, die Zufallsauswahl. PHP kennt datz 2 Befehle: rand() und mt_rand()>. Beide tun genau das gleiche, nach dem PHP Handbuch soll letztere aber besser sein.

1
2
3
$count = count($pics) - 1;
$pic_num = mt_rand(0, $count);
$pic = $pics[$pic_num];

Die ersten beiden Zeilen könnte man auch zusammenfassen, der Übersicht halber sind sie dieses mal auseinander. ;)

Nun die Ausgabe:

1
echo '<p>Zufallsbild:<br /><img src="bilder/'.$pic.'" alt="Zufallsbild" /></p>';

Nicht vergessen, die If-Abfrage von vorhin abzuschließen. ;)

Das war’s auch schon, hier nochmal der komplette Code ohne Zeilennummern und eine Online-Demo (da ich nur 6 Bilder habe können diese sich öfters wiederholen). Man könnte das Skript natürlich noch ausbauen, z.B. Bildbeschreibungen.
Dazu diesen Code vor das echo() schreiben:

1
2
	// Bildbeschreibung
	$description = ( file_exists($path . $pic. '.txt') ) ? file_get_contents($path . $pic. '.txt') : '';

Es wird geprüft ob es eine Datei mit dem Namen und der Endung .txt existiert. Falls ja wird diese Datei ausgelesen, falls nein ist die Beschreibung leer.
Die vorherige Ausgabe + Beschreibung:

1
echo '<p>Zufallsbild:<br /><img src="bilder/'.$pic.'" alt="Zufallsbild" /><br />'.$description.'</p>';

Kompletter Code | Demo

Viel Spaß beim Nachmachen :)

¬ geschrieben von Michael in PHP, Tutorials

« Links eins

Zahl des Tages » 

Hinterlasse einen Kommentar

Theme von BenediktRB • Powered by Wordpress • Abonniere den RSS Feed