dedlfix: Unterordner durchsuchen und alles in EINEM Array setzen

Beitrag lesen

Tach!

Wie es in "modern" besser geht, hat Sven ja schon aufgezeigt. Aber auch in "herkömmlich" lässt sich einiges verbessern.

Kann mir einer zeigen wie das geht, oder wo und wie muss ich das mit dem array_push machen?

array_push() braucht man im Prinzip gar nicht. $array[] = ...; ist die bevorzugte und schnellere (weil ohne Funktionsaufruf) Methode beim Anfügen von einzelnen Werten.

opendir/readdir/closedir sind schon recht alte Gesellen. Deswegen findet man Lösungen mit ihnen an jeder Ecke. glob() findet man seltener, dabei kommt man damit komfortabler zum Ziel, weil man mit nur einem Aufruf genau das Gesuchte und nichts überflüssiges bekommt. Ich nehme mal an, dass dich auch der Pfad zum Bild interessiert und nicht nur der nackige Dateiname.

glob("/path/to/images/*.{png,gif,jpg}", GLOB_BRACE)

liefert alle Dateien mit den angegebenen Endungen nebst dem angegebenen Pfad. Wenn er nicht so lang sein soll, kannst du mit chdir() ins gewünschte Ausgangsverzeichnis wechseln und von dort aus relativ suchen. Fürs rekursive Durchlaufen werden außerdem noch die Unterverzeichnisse benötigt, die man mit

glob("/path/to/images/*", GLOB_ONLYDIR)

bekommt.

$bilder = array();
function scan($folder){
  if($content = opendir($folder)){
    while(false !== ($file = readdir($content))){
      if(is_dir($folder.'/'.$file) && $file != "." && $file != ".." ){
           scan($folder.'/'.$file);
      } elseif($file != "." && $file != ".." && (stristr($file, '.jpg') || stristr($file, '.gif') || stristr($file, '.png'))) {
$bilder[]= $file;
  }
    }
    closedir($content);
  }
}
// function end

Du schriebst einleitend, dass das so schon funktioniert hat, was aber mit dem Code nicht stimmen kann. $bilder ist ein Array im globalen Scope, innerhalb der Funktion scan() ist $bilder eine andere und auch nur lokale Variable. Du sammelst zwar die Dateinamen, aber nach dem Funktionsende sind sie nicht mehr verfügbar. Da fehlt also noch eine globals-Deklaration oder besser ein Zurückliefern als Funktionsergebnis nebst Verarbeiten desselben.

Wie müsste man nun stattdessen mit glob() arbeiten? Wegen der benötigten Rekursivität ist weiterhin das Erstellen einer Funktion angebracht, welche wieder das zu durchsuchende Verzeichnis übergeben bekommt und als zweiten Parameter das Dateinamenmuster. In der Funktion liefert der erste glob-Aufruf bereits alle Dateien in einem Array, was sich schon mit print_r() und var_dump() überprüfen lässt. glob() bekam dafür natürlich Pfad und Muster zusammengefügt übergeben. In einer Schleife muss man nun noch für jedes vom zweiten glob-Aufruf (nur mit Pfad und angehängtem *) zurückgegebene Unterverzeichnis die Funktion erneut aufrufen, mit dem Pfad zum Unterverzeichnis und dem durchgereichten Muster als Parameter. Das Funktionsergebnis ist, wie gleich noch zu sehen sein wird, ein Array mit Dateinamen. Das muss noch an das Array des ersten glob() angehängt werden, wofür sich array_merge() eignet. Das mit return zurückgegebene Funktionsergebnis ist dann dieses zusammengefügte Array. Wenn man das effizient notiert, bekommt man die Funktion in insgesamt 6 Zeilen hin.

dedlfix.