PHP5 fügt Iterator hinzu, eine Reihe vorgefertigter Schnittstellen, die beim Navigieren und Verwalten hierarchischer Datenstrukturen helfen. Dies ist eine der interessantesten neuen Funktionen von PHP5.
Diese Iteratoren reduzieren den Code, der zum Verarbeiten eines XML-Dokumentbaums oder einer Dateisammlung erforderlich ist, erheblich. In PHP5 wird eine große Anzahl von Iteratoren verwendet, darunter ArrayIterator, CachingIterator, LimitIterator, RecursiveIterator, SimpleXMLIterator und DirectoryIterator.
DirectoryIterator kann Dateien im Verzeichnis schnell und effizient verarbeiten. Mit etwas mehr Kreativität im Codierungsprozess können mit DirectoryIterator auch verschachtelte Verzeichnisbäume rekursiv verarbeitet werden. Beide Aufgaben können mit nur wenigen Codezeilen erledigt werden, was eine deutliche Verbesserung gegenüber dem „Standard“-Ansatz darstellt.
Verarbeiten eines einstufigen Verzeichnisses Zunächst beginnen wir mit einer einfachen Aufgabe: dem Verarbeiten eines einstufigen Verzeichnisses. Geben Sie den folgenden Code ein (oder kopieren Sie ihn) (Listing A) und ändern Sie den Verzeichnispfad, um die lokale Konfiguration widerzuspiegeln:
Listing A
<?php$it = new DirectoryIterator("/tmp/mystuff");foreach($it as $file) {if ( !$it->isDot()) {echo $file . "n";}}?>Sehen Sie sich die Ausgabe dieses Codes im Browser an. Sie sehen eine Liste der Dateien im angegebenen Verzeichnis. Wie ist das passiert? DirectoryIterator bietet eine vordefinierte Schnittstelle zum Neuformulieren des Inhalts eines Verzeichnisses. Sobald der Speicherort des Zielverzeichnisses ermittelt wurde, kann es als Standard-PHP-Array behandelt werden, wobei jedes Element eine Datei im Verzeichnis darstellt. Beachten Sie, dass die Methode isDot() verwendet wird, um die Verzeichnisse „.“ und „..“ herauszufiltern.
Umgang mit verschachtelten Verzeichnisbäumen Der rekursive Umgang mit einem verschachtelten Verzeichnisbaum ist fast genauso einfach. In diesem Fall muss DirectoryIterator jedes Objekt überprüfen, auf das er im einstufigen Verzeichnis trifft, um festzustellen, ob es sich um eine Datei oder ein Verzeichnis handelt. Wenn es sich um ein Verzeichnis handelt, gehen Sie eine Ebene tiefer, um den Inhalt der nächsten Ebene zu überprüfen. Das mag recht komplex klingen und erforderte in der Vergangenheit typischerweise mehr als 15 Codezeilen.
Mit PHP5 benötigen Sie jedoch nur zwei neue Iteratoren: RecursiveIterator und RecursiveIteratorIterator, die alle oben genannten Funktionen vereinen. Siehe Liste B:
Liste B
<?php$it = new RecursiveDirectoryIterator("/tmp");foreach(new RecursiveIteratorIterator($it) as $file) {echo $file "n";}?>Geben Sie zu diesem Zeitpunkt ein Das Ergebnis: Alle Dateien und Verzeichnisse im Startverzeichnis werden aufgelistet. Selbstverständlich ist diese rekursive integrierte Schnittstelle sehr praktisch, wenn Sie alle Dateien unter einer bestimmten Verzeichnisebene verarbeiten müssen – zum Beispiel beim rekursiven Komprimieren eines Verzeichnisbaums oder beim Ändern der Gruppen-/Eigentümerberechtigungen einer Reihe verschachtelter Dateien.
Reale Anwendung: Drucken eines Verzeichnisbaums Das Drucken eines grafischen Verzeichnisbaums ist eine häufige Anwendung der Verzeichnisrekursion. Die Verwendung von Iterator zur Bewältigung dieser Aufgabe ist sehr einfach, da die Dokumentation der Iterator-Klasse eine speziell für diese Anwendung geschriebene Instanzklasse enthält. DirectoryTreeIterator (Dank an Marcus Boerger) bietet weitere Verbesserungen gegenüber dem zuvor besprochenen RecursiveIteratorIterator, insbesondere ASCII-Tags, die Tiefe und Position in der Baumstruktur darstellen.
Listing C veranschaulicht die Verwendung von DirectoryTreeIterator.
Listing C
<?php$it = new DirectoryTreeIterator("/tmp/cookbook/");foreach($it as $path) {echo $path . "n";}?>Hier ist ein Teil der Ausgabe, die Sie sehen:
| -ch01|. |-example01| Um den Wert dieser DirectoryIterators besser zu verstehen, versuchen Sie, die drei in diesem Tutorial dargestellten Anwendungen mit Standarddatei- und Verzeichnisfunktionen zu programmieren.