How-To: Zufälliges Bild in die Webseite einbinden (Teil 2: Mehrere Ordner)

28. September 2007

Im ersten Teil habe ich beschrieben wie man aus einem Ordner ein zufällig Bild auslesen kann. Im zweiten Teil wird dies um eine rekursive Funktion erweitert, so dass ganze Ordnerstrukturen eingelesen werden zu können. Das Ergebnis wird dann in einem Array zwischengespeichert, um den Server bei vielen Seitenaufrufen nicht durch ständiges (und unnötiges) Neuauslesen der Ordner belastet.

Zuerst einmal ein kleines Problem: Im Dateisystem können wir bequem absolute Pfade benutzen um besser mit rekursiven Funktionen durch Verzeichnissen laufen zu können. In der Ausgabe als Bild können wir selbstverständlich keine absoluten Pfade des Dateisystems benutzen.
Ich werde jetzt trotzdem mit absoluten arbeiten und dann am Ende auf relative stutzen, einfach aber wirksam. ;)

Anfang des Skript

Zuerst einmal brauchen wir den absoluten Pfad des Skripts. Dieser ist nötig, damit wir später die Pfade der Bilder von absoluten zu relativen stutzen können.

1
$path = dirname(__FILE__);

Die Funktion zum Auslesen

Wir können nun nicht mehr ein einfaches Stückchen Code im Quelltext eines Skripts verwenden, da der Code einige Male benötigt wird.

Die Funktion benötigt 2 Parameter: Einmal in welchem Pfad gesucht werden soll (Absoluter Pfad erforderlich) und welche Dateitypen verwendet werden sollen. Diese Funktion kann man nicht nur für Bilder verwenden. ;)

1
2
function GetImageList($path, $extensions = array('jpg', 'gif', 'png') )
{

Falls wir keinen Schrägstrich / am Ende haben, müssen wir noch einen dazu machen:

1
2
	// Abschließenden Schrägstrich einfügen
	if ( substr($path, 1, -1) != '/' ) $path .= '/';

Jetzt kommt eigentlich erst der spannende Teil, das Auslesen des Verzeichnisses. Zuerst öffnen wir dieses und machen $images zu einem Array.

1
2
3
	// Verzeichnis auslesen
	$dir = opendir($path);
	$images = array();

Jetzt wird das Verzeichnis Ordner für Ordner und Datei für Datei ausgelesen und in $file gespeichert. Der Vergleich mit dem boolschen Operator !== ist nötig, damit die Schleife nicht bei Dateien die z.B. 0 heißen einfach abbricht. Danach werden die virtuellen Ordner “.” und “..” aussortiert, da diese nicht gebraucht werden.

1
2
3
4
	while ( ( $file = readdir($dir) ) !==  false )
	{
		if ( $file != '.' && $file != '..' )
		{

Jetzt kommt die eigentliche Rekursion. Wenn der aktuelle Verzeichniseintrag ein Ordner ist, ruft sich die Funktion selbst auf und kann so noch tiefer in den Verzeichnisbaum eintauchen, ansonsten wird geprüft ob die Dateierweiterung in dem Array $extensions ist und bei Wahr in das Bilder-Array übernommen. Mit array_merge wird das Bilder-Array mit der Rückgabe des Selbstaufrufes zusammen genommen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
			// Verzeichnis oder Ordner?
			if ( is_dir($path . $file) )
			{
				// Haben wir schon Bilder? Falls ja, array anfügen
				$images = (empty($images)) ? GetImageList($path . $file, $extensions) : array_merge($images, GetImageList($path . $file, $extensions));
			}
			else
			{
				// Bild dazu wenn die Erweiterung ok ist
				if ( in_array(substr($file, -3, 3), $extensions) )
				{
					$images[] = $path . $file;
				}
			}

Jetzt noch die Schleifen wieder zu machen und das Ergebnis zurück geben.

1
2
3
4
5
6
7
		}
	}
	// Fertige Liste zurück geben
	return $images;
}
 
$images = GetImageList(dirname(__FILE__));

Gut, wir haben die Bilder. Aber halt, an etwas von der Einleitung erinnert? Wir haben jetzt absolute Pfade. Diese können wir aber schnell stutzen:

1
2
3
4
5
$len = strlen($path);
foreach ( $images as $key => $image )
{
	$images[$key] = substr($image, $len);
}

Zuerst ermitteln wir die Länge des Pfades. Danach gehen wir durch jedes Element des Bilder-Arrays und nehmen des Inhalt beginnend ab der Länge des Pfades, so schneiden wir ihn einfach und schnell ab. Am Ende haben wir dann relative Pfade :)

Jetzt können wir den Code von Teil 1 wieder benutzen um eine zufälliges Bild zu nehmen. Es gibt aber eine noch hübschere Methode: array_rand().

Kompletter Code mit Ausgabe

Auf das Caching gehe ich jetzt nicht weiter ein, da ich darüber schon an anderer Stelle was geschrieben habe. Man kann die Anleitung von dort prima auf diesen Fall anwenden.

Kompletter Code mit Ausgabe (Cachende Variante)

Viel Spaß beim Ausprobieren! Backlinks bei Verwendung wäre nett. ;)

¬ geschrieben von Michael in PHP, Tutorials

« Links drei

Für alle Opera User » 

Hinterlasse einen Kommentar

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