Sven Rautenberg: Unterordner durchsuchen und alles in EINEM Array setzen

Beitrag lesen

Moin!

folgenden Code habe ich, funktioniert auch.
Nur ich möchte alles in einem Array haben und nicht für jeden Unterordner ein Array.
Kann mir einer zeigen wie das geht, oder wo und wie muss ich das mit dem array_push machen?

Die Frage ist: Was willst du eigentlich grundsätzlich erreichen?

kann mir einer helfen?

session_start();
$linkURLImpressionen = $_SESSION['link'];
$ordner = $_SERVER['DOCUMENT_ROOT'].$linkURLImpressionen;
$handle = opendir($ordner);

// function start
$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

scan($ordner);

  
Wozu session\_start()?  
  
Ich sag mal, wie das da oben aussieht: Offenbar willst du eine beliebig tiefe Ordnerstruktur nach Dateien mit den Endungen .jpg, .gif und .png durchsuchen, und am Ende eine Liste genau dieser Dateien haben. Und dann ggf. abarbeiten.  
  
Lösungsvorschlag: Lass PHP die meiste Arbeit erledigen, für solche Aufgaben gibt es seit Version 5.1 tolle Iteratoren als Standardklassen mitgeliefert.  
  
Der [RecursiveDirectoryIterator](http://de2.php.net/manual/de/class.recursivedirectoryiterator.php) erledigt für dich, rekursiv durch eine Directorystruktur durchgehen zu müssen. Dazu musst du nur das oberste Verzeichnis angeben, was durchsucht werden soll.  
  
Der [RecursiveFilterIterator](http://de2.php.net/manual/de/class.recursivefilteriterator.php) filtert für dich das Ergebnis eines rekursiven Iterators, wie der RecursiveDirectoryIterator einer ist. Dazu musst du nur eine eigene Klasse schreiben, die RecursiveFilterIterator extended, und dort eine Methode "accept" reinschreiben, die true zurückgibt, wenn das aktuelle Einzelergebnis deinem Filterwunsch entspricht.  
  
Der [RecursiveIteratorIterator](http://de2.php.net/manual/de/class.recursiveiteratoriterator.php) schließlich nimmt ebenfalls einen rekursiven Iterator entgegen und macht die rekursive Struktur flach, so dass man ganz leicht mit einer einzelnen foreach-Schleife das gesamte Ergebnis durchlaufen kann, ohne selbst die Rekursion nachvollziehen zu müssen.  
  
Diese ganze Konstruktion ist dann SOOO kurz:  
~~~php
$dirItr    = new RecursiveDirectoryIterator('/sample/path');  
$filterItr = new MyRecursiveFilterIterator($dirItr);  
$itr       = new RecursiveIteratorIterator($filterItr, RecursiveIteratorIterator::SELF_FIRST);  
  
foreach ($itr as $filePath => $fileInfo) {  
    echo $fileInfo->getFilename() . PHP_EOL;  
}  

Drei Zeilen Code zur Vorbereitung des Iterierens über die Directory-Struktur.

Und eine Schleife über die Variable mit dem RecursiveIteratorIterator, die dann das Verzeichnis ausliest und dort nur die Ergebnisse findet, die der RecursiveFilterIterator durchgelassen hat.

So ein Filter ist sehr leicht zu bauen:

class MyRecursiveFilterIterator extends RecursiveFilterIterator {  
  
    public function accept() {  
        if ($this->current()->getExtension() == "jpg") {  
            return true;  
        }  
        return false;  
    }  
  
}

Im RecursiveFilterIterator erhältst du mit $this->current() das aktuelle Element des inneren Iterators. Das ist der gesamte Dateisysteminhalt aller Unterverzeichnisse, durch den der RecursiveDirectoryIterator durchläuft. Dieser Iterator liefert für alle gefundenen Verzeichniseinträge ein SplFileInfo-Objekt zurück, welches viele nette Funktionen hat, um Eigenschaften der jeweiligen Datei zu ermitteln. getExtension() liefert beispielsweise die letzte Dateiendung zurück (ohne Punkt).

Dasselbe gilt auch für die einzelnen Elemente in der foreach-Schleife. Die sind ebenfalls SplFileInfo-Objekte, und damit viel mächtiger, als nur ein simpler Dateiname. Alle Funktionen auf der SplFileInfo-Seite stehen dir auch in deiner Schleife zur Verfügung.

- Sven Rautenberg