Schneller Tipp Durchlaufordner mit PHP () von PHP

Verwenden Sie noch opendir (), um Ordner in PHP durchzugehen? Erfordert dies nicht jedes Mal wiederholten Code, wenn Sie einen Ordner durchsuchen möchten? Glücklicherweise ist glob () von PHP eine viel intelligentere Lösung.


Einführung

Hier ein Beispiel, wie Sie einige Informationen aus einem Ordner mit Hilfe der traditionellen Funktion opendir () wiedergeben können.

 $ dir = "/ etc / php5 /"; // Öffnen Sie ein bekanntes Verzeichnis und lesen Sie dessen Inhalt fort. If (is_dir ($ dir)) if ($ dh = opendir ($ dir)) while (($ file = readdir ($ dh))! ) echo "Dateiname: $ Datei: Dateityp:". Dateityp ($ dir. $ -Datei). "\ n";  closedir ($ dh);  

Das sollte etwas bekannt aussehen. Wir können den Code oben massiv verkürzen mit:

 $ dir = "/ etc / php5 / *"; // Öffnen Sie ein bekanntes Verzeichnis und lesen Sie den Inhalt von foreach (glob ($ dir) als $ -Datei) echo "Dateiname: $ -Datei: Dateityp:". Dateityp ($ -Datei). "
";

Ist das nicht viel einfacher? Lust darauf zu erfahren, wie die Methode funktioniert? Wenn ja, dann machen wir weiter.

glob () unterstützt insgesamt zwei Argumente, wobei das zweite Argument optional ist. Das erste Argument ist der Pfad zum Ordner, der jedoch etwas leistungsfähiger ist.


Schritt 1. Das erste Argument

Dieses erste Argument unterstützt ein Muster. Dies bedeutet, dass Sie die Suche auf bestimmte Dateitypen oder sogar mehrere Verzeichnisse gleichzeitig begrenzen können, indem Sie mehrere Sternchen "*" verwenden. Nehmen wir an, Sie haben eine Website, auf der Benutzer Bilder hochladen können (nur weil ich dies gelesen habe). Jeder Benutzer hat seinen eigenen Ordner im Ordner "userImages". In diesen Ordnern befinden sich zwei zusätzliche Ordner mit den Bezeichnungen "HD" und "TN" für hochauflösende Bilder (in voller Größe) und für Thumbnails. Stellen Sie sich vor, Sie möchten alle "TN" -Ordner Ihrer Benutzer durchlaufen und die Dateinamen drucken. Dies würde einen relativ großen Codeausschnitt erfordern, wenn Sie open_dir () verwenden. Mit glob () ist das jedoch einfach.

 foreach (glob ('userImages / * / TN / *') als $ image) echo "Dateiname:". $ image. "
";

Dies durchsucht userImages / any / TN / any und gibt eine Liste der Dateien zurück, die dem Muster entsprechen.

 Dateiname: userImages / username1 / TN / test.jpg Dateiname: userImages / username1 / TN / test3.jpg Dateiname: userImages / username1 / TN / test5.png Dateiname: userImages / username2 / TN / Unterordner Dateiname: userImages / username2 / TN / test2.jpg Dateiname: userImages / username2 / TN / test4.gif Dateiname: userImages / username3 / TN / styles.css 

Wir können sogar noch einen Schritt weiter gehen und genauer sein, indem wir ein Dateiformat in unsere foreach-Anweisung aufnehmen:

 foreach (glob ('userImages / * / TN / *. jpg') als $ image) echo "Dateiname:". $ image. "
";

Jetzt werden nur JPEGs zurückgegeben.

 Dateiname: userImages / username1 / TN / test.jpg Dateiname: userImages / username1 / TN / test3.jpg Dateiname: userImages / username2 / TN / test2.jpg 

Es kommt noch besser. Was ist, wenn Sie zum Beispiel JPEGs benötigen, aber auch Gifs? nichts anderes? Oder was ist, wenn Sie nur Ordnernamen drucken möchten? Hier kommt das zweite Argument ins Spiel.


Schritt 2. Das zweite Argument

Das zweite Argument ist, wie bereits erwähnt, optional. Es bietet jedoch einen sehr schönen Satz optionaler Flags. Dadurch können Sie das Verhalten Ihres glob () ändern.

  • GLOB_MARK: Fügt jedem zurückgegebenen Verzeichnis einen Schrägstrich hinzu
  • GLOB_NOSORT: Dateien zurückgeben, wie sie im Verzeichnis erscheinen (keine Sortierung)
  • GLOB_NOCHECK: Gibt das Suchmuster zurück, wenn keine passenden Dateien gefunden wurden
  • GLOB_NOESCAPE: Backslashes enthalten keine Metazeichen
  • GLOB_BRACE: Erweitert a, b, c auf 'a', 'b' oder 'c'
  • GLOB_ONLYDIR: Nur Verzeichniseinträge zurückgeben, die dem Muster entsprechen
  • GLOB_ERR: Stop bei Lesefehlern (wie unlesbare Verzeichnisse), standardmäßig werden Fehler ignoriert

Wie Sie sehen, können die potenziellen Anforderungen, die wir am Ende von Schritt 1 festgestellt haben, leicht mit GLOB_BRACE behoben werden:

 foreach (glob ('userImages / * / TN / *. jpg, *. gif', GLOB_BRACE) als $ image) echo "Dateiname:". $ image. "
";

was wird das zurückgeben:

 Dateiname: userImages / username1 / TN / test.jpg Dateiname: userImages / username1 / TN / test3.jpg Dateiname: userImages / username2 / TN / test2.jpg Dateiname: userImages / username2 / TN / test4.gif 

Wenn Sie nur Unterordnernamen drucken möchten, können Sie GLOB_ONLYDIR verwenden:

 foreach (glob ('userImages / * / TN / *', GLOB_ONLYDIR) als $ image) echo "Dateiname:". $ image. "
";

was gedruckt wird:

 Dateiname: userImages / username2 / TN / Unterordner 

Schlussfolgerung und ein weiteres Beispiel

Diese Methode ist seit PHP 4.3 verfügbar, wird jedoch nicht sehr oft verwendet. Ich habe es erst spät gelernt. Nun verwende ich oft glob (), wenn ich Plugins in mein Framework lade:

 foreach (glob ('includes / plugins / *. php') als $ plugin) include_once ($ plugin);  

Das ist alles; Ich hoffe, Ihnen hat dieser schnelle Tipp gefallen, und lassen Sie es mich wissen, wenn Sie Fragen haben!