Verzeichnisse rekursiv/iterativ durchsuchen

Tja, da gibt man sich solche Mühe. Hat sich sogar schon einen Algorithmus zusammengebastelt und sucht nur noch die ganzen PHP-Methoden bzw. überprüft ob PHP das auch kann. Dann stöbert man ein bisschen in den Kommentaren zu den Funktionen..

..und was entdeckt man?
Einen drei Zeiler, der die Verzeichnisse komplett durchforstet und alle Unterverzeichnisse auflistet.
Klassischer Fall:

Der Vollständigkeit halber hier der Code-Schnipsel:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$it = new RecursiveDirectoryIterator('./');
// RecursiveIteratorIterator accepts the following modes:
//     LEAVES_ONLY = 0  (default)
//     SELF_FIRST  = 1
//     CHILD_FIRST = 2
foreach (new RecursiveIteratorIterator($it, 2) as $path) {
    if ($path->isDir()) {
        echo "$path\n";
    }
}
?>

Also hingenangen und ausprobiert.
Doch zu früh gefreut. Es gibt zwar alle Pfade aus, aber leider nur die tiefstens Pfade. Gibt es z.B. das Verzeichnis /partent mit den Unterverzeichnissen /child_1 und /child_2 gibt die Methode /partent/child_1 und /partent/child_2 aus. Da aber auch im /parten-Verzeichnis Daten sein können, funktioniert das schonmal nicht so, wie wir uns das vorstellen.
(Außerdem werden die Verzeichnisse mit \ ausgeben. Nicht sehr hilfreich.)

Aber nicht nur Romeo&Julia hat ein Happy End. Auch meine Geschichte hat ein gutes Ende. Denn beim weiteren Durchstöbern der PHP-Funktionen fand ich diesen Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
     function get_leaf_dirs($dir)
      {
         $array = array();
         $d = @dir($dir);
         if($d)
         {
               while (false !== ($entry = $d->read()))
               {
                   if($entry!='.' && $entry!='..')
                   {
                       $entry = $dir.'/'.$entry;
                       if(is_dir($entry))
                       {
                           $subdirs = get_leaf_dirs($entry);
                           if ($subdirs)
                             $array = array_merge($array, $subdirs);
                           else
                             $array[] = $entry;
                       }
                   }
               }
               $d->close();
         }
         return $array;
      }
 
	  $dir = './';
	  print_r(get_leaf_dirs($dir));
?>

..und was soll ich sagen. Ich bin so glücklich. Ich könnte weinen. Aber ich tus nich! Bin ja schließlich nen Mann.

Der nächste Schritt ist also den alten Code anpassen.

So long,
Seb

Verwandte Artikel

Autor: Seb
Datum: Thursday, 3. July 2008 23:02
Trackback: Trackback-URL Themengebiet: PHP

Feed zum Beitrag: RSS 2.0 Diesen Artikel kommentieren

Ein Kommentar

  1. 1

    [...] die Ausgabe des Algorithmus von Gestern noch nich das war, was ich eigentlich wollte, aber das Grundgerüst sehr gut war, habe ich diesen [...]

Kommentar abgeben