Ordner Struktur bis 3 ebene auslesen mit Iteratoren


Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

basti1012

Erfahrenes Mitglied
Ich wollte mein ganzes Verzeichniss auslesen was auch alles klappt.
Doch ich brauche nur die Ordner.
PHP:
$sRootDir = 'tools/';
$itrDirectory = new RecursiveDirectoryIterator( $sRootDir );
$itrIterator = new RecursiveIteratorIterator( $itrDirectory, RecursiveIteratorIterator::SELF_FIRST );
$aRecursiveDirContent = array();
$itrIterator->rewind();
   while ($itrIterator->valid() ) {
      $splFileInfo = $itrIterator->current();
      $directory = $splFileInfo->getPath();
      //$directory = new LimitIterator($directory, 1, 3);
      if ( $splFileInfo->isDir() && !isset($aRecursiveDirContent[$directory])) {
          $aRecursiveDirContent[$directory] = array();
      }
          $itrIterator->next();
  }
 
echo "<pre>";
print_r($aRecursiveDirContent);
echo "</pre>";
So bekomme ich alle Ordner bis ebene 10 usw
Das geht auch noch , doch ich brauche nur die Ordner die bis zur dritten ebene gehen .
Da komme ich nicht weiter. Habe was gefunden womit es gehen könnte , doch ich weiß nicht wie man das anwenden muß.
Code:
 //$directory = new LimitIterator($directory, 1, 3);
Vieleicht liege ich ja auch voll falsch.
Da wo es im Code auskommentiert ist, liest er mir die ersten 3 Einträge aus , aber es soll halt 3 Order tiefer gehen in der Struktur und nicht bis zum Keller.

Geht das überhaupt damit ?
Was mache ich da falsch ?
 

basti1012

Erfahrenes Mitglied
Ich glaube ich bin zu blöd dazu.
Mein Ergebniss kommt der sache schon näher, aber müßte dann später den array beim auseinander nehmen noch weiter bearbeiten.
Also ich meine.
Der Code ist jetzt so
Code:
$sRootDir = './';
$maxDepth=1;
$minDepth=1;
$itrDirectory = new RecursiveDirectoryIterator( $sRootDir );
$itrIterator = new RecursiveIteratorIterator( $itrDirectory, RecursiveIteratorIterator::SELF_FIRST );
$aRecursiveDirContent = array();

$itrIterator->rewind();
$itrIterator->setMaxDepth($maxDepth);
    foreach ($itrIterator as $sRootDir => $dir) {
        if ($itrIterator->getDepth() >= $minDepth) {
             if ($dir->isDir() == "." OR $dir->isDir() == "..") {
                        $aRecursiveDirContent[] = $sRootDir;
            }
        }

    }

echo "<pre>";
print_r($aRecursiveDirContent);
echo "</pre>";
Das Ergebiss ( ein Teil davon )
[0] => ./tutorialshtml/include
[1] => ./tutorialshtml/..
[2] => ./tutorialshtml/datenbank
[3] => ./tutorialshtml/.
[4] => ./api/include
[5] => ./api/..
[6] => ./api/.
[7] => ./html/..
[8] => ./html/.

Mein Ziel Ergebniss wäre
[0] => ./tutorialshtml/
[1] => ./tutorialshtml/include/
[2] => ./tutorialshtml/datenbank/
[3] => ./api/
[4] => ./api/include/
[5] => ./html/

So ungefähr sollte es sein.Habe beim Code mit den min und max schon rumgespielt , doch alles andere ist noch weiter entfernt vom Ziel.

Ich könnte zwar mit fusch mit den jetztigen Ergebniss arbeiten , doch ich denke das es bestimmt noch anders gehen muss, bzw benutze ich die functionen hier irgendwie falsch.


Ein gutes hat es. Durch die Spielerein habe ich meine zweiten Wunsch schon lösen können.
Alle Datein in den 3 Ebenen ausgeben zu lassen , aber das nur nebenbei gesagt.
 

Sempervivum

Erfahrenes Mitglied
Die Pünktchen-Einträge kannst Du, wie in dem Beispiel, leicht mit der Option SKIP_DOTS ausfiltern.
Wenn ich das Beispiel von php.net etwas vereinfache, funktioniert es einwandfrei:
Code:
$path = './_HP-Subdomain/monice/';
$maxDepth = 2;
$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS),
    RecursiveIteratorIterator::SELF_FIRST,
    RecursiveIteratorIterator::CATCH_GET_CHILD// Ignore "Permission denied"
);
$iterator->setMaxDepth($maxDepth);

$paths = [];
foreach ($iterator as $path => $dir) {
        if ($dir->isDir()) {
            $paths[] = $path;
        }

}
var_dump($paths);
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Neue Beiträge