[PHP Grundlagen] Verzeichnisse rekursiv iterieren mit der SPL - Druckversion +- PHP Rocks (https://www.php-rocks.de) +-- Forum: Knowledge Base (https://www.php-rocks.de/https://www.php-rocks.de/forum/18-knowledge-base.html) +--- Forum: Tutorials (https://www.php-rocks.de/https://www.php-rocks.de/forum/20-tutorials.html) +--- Thema: [PHP Grundlagen] Verzeichnisse rekursiv iterieren mit der SPL (/https://www.php-rocks.de/thema/56-verzeichnisse-rekursiv-iterieren-mit-der-spl.html) |
Verzeichnisse rekursiv iterieren mit der SPL - Arne Drews - 14.05.2015 Was bezweckt dieses Tutorial In größeren Projekten kann es hilfreich sein, ab einem bestimmten Einstiegspunkt die komplette Verzeichnisstruktur inklusive der Datei-Informationen rekursiv bspw. in einem Array vorzuhalten. Ich möchte hier kurz zeigen, wie das mit Hilfe der SPL ( Standard PHP Library ) möglich ist. Da die SPL über eine Auswahl an Iteratoren verfügt, brauchen wir uns um die Rekursion innerhalb der Verzeichnisstruktur keine Gedanken machen, geschweige denn dafür sich selbst aufrufende Funktionen/Methoden zu entwickeln. Wir fangen an ...und zwar ganz einfach mit Angabe des Einstiegsverzeichnis $sRootDir und dem Initiieren der beiden SPL-Iteratoren RecursiveDirectoryIterator und RecursiveIteratorIterator . Für unser Beispiel gehen wir mal vom Einstiegsverzeichnis images aus:PHP-Code: $sRootDir = 'images'; Zu Beachten ist, daß das Objekt an sich noch keine Daten enthält, sondern lediglich die Iteration und das Abrufen der Informationen über Methoden zur Verfügung stellt. Die Iteration selbst kann praktischerweise wie bei Arrays mit foreach durchgeführt werden. Ich entscheide mich hier für die while -Variante, da ich dieser eine sinnigere Logik abgewinnen kann. Das ist allerdings nur meine persönliche Ansicht!Sammeln der Informationen über die Iteration Zunächst bereiten wir die Iteration vor, indem wir den Zeiger des Objektes mit der Methode rewind() zurücksetzen. Zudem deklarieren wir uns ein Array, das die gesammelten Daten am Ende enthält: PHP-Code: $aRecursiveDirContent = array(); while relativ einfach. Dazu bedienen wir uns der Methode valid(), die uns Auskunft darüber gibt, ob wir über ein gültiges Element verfügen:PHP-Code: while ( $itrIterator->valid() ) { next() setzen wir den Zeiger des Objektes auf das nachfolgende Element.Jetzt müssen wir nur noch... Informationen sammeln Jetzt kommt es auf den subjektiven Fall an, wie wir die Daten sammeln und welche überhaupt. Ich habe für dieses kleine Tutorial mal für mich festgelegt, daß wir am Ende in $aRecursiveDirContent über alle Verzeichnisse als Schlüssel-Element verfügen, deren Werte auf Array-Basis die Dateien mit erweiterten Informationen enthalten.Folgende Datei-Informationen wollen wir erhalten:
Dazu holen wir uns zunächst über current() ein Objekt vom Typ SplFileInfo vom aktuellen Element und den Verzeichnisnamen mit der Methode getPath() :PHP-Code: $splFileInfo = $itrIterator->current(); PHP-Code: if ( $splFileInfo->isDir() && !isset($aRecursiveDirContent[$directory]) ) { isDir() prüfen wir, ob es sch bei dem aktuellen Element um ein Verzeichnis handelt.Auf die gleiche Art prüfen wir mit der Methode isFile() im nächsten Step, ob es sich um eine Datei handelt und tragen unsere Informationen zusammen. Dazu möchte ich erstmal den gesamten Code-Block zeigen und die wichtigen Punkte hinterher ansprechen:PHP-Code: if ( $splFileInfo->isFile() ) { $aRecursiveDirContent .Der Vollständigkeit, hier nochmal die verwendeten Methoden der Datei-Informationen:
Damit haben wir nun alle Daten in einem Array gesammelt, dies könnt ihr euch testweise mit print_r oder var_dump ausgeben lassen. Die Ausgabe kann bspw. so aussehen:Code: Array Der komplette Code zur Übersicht Um das kleine Tutorial damit abzuschliessen, hier nochmal der ganze Code als Übersicht: PHP-Code: $sRootDir = 'images'; |