1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Verzeichnis rekursiv durchlaufen

Dieses Thema im Forum "PHP" wurde erstellt von Metha, 9. Dezember 2008.

  1. Metha

    Metha Grünschnabel

    Moin Moin,

    hänge jetzt schon seit Stunden vor dem vermeintlich banalem Problem, ein Verzeichnis rekursiv zu durchlaufen.

    PHP:
    1. function readdirs($path, $array=NULL)
    2.     {
    3.     $entrys=scandir($path);
    4.     foreach($entrys as $part)
    5.         {
    6.         if(is_dir($path.$part) && preg_match('/^\[t\]_(.+)/i', $part, $hit))
    7.             {
    8.             $array[]=array('path' => $path.$hit[0], 'name' => $path.$hit[1]);
    9.             }
    10.         if(is_dir($path.$part) && !preg_match('/^(.|..)$/i', $part, $hit))
    11.             {
    12.             readdirs($path.$part.'/', $array);
    13.             }
    14.         }
    15.     return($array);
    16.     }
    17.  
    18. # Funktionsaufruf
    19. $test=readdirs($_SERVER['DOCUMENT_ROOT'].'/');
    20. print_r($test);
    21.  
    Die Funktion soll mir alle Ordner mit den anfangszeichen '[t]_' in ein Array speichern und zurückgeben.

    Ich bekomme aber nur immer den ersten Ordner auf den dies zutrifft zurück!

    Ich hoffe ich sehe einfach den Wald vor lauter Bäumen nicht?!
    Jemand ne Idee wo mein Fehler ist?

    Gruß Metha
  2. Gumbo

    Gumbo Erfahrenes Mitglied

    Du verarbeitest ja auch nicht den Rückgabewert des Rekursionsaufrufs weiter. Diesen müsstest du aber mit $array vereinigen.
  3. Metha

    Metha Grünschnabel

    Tut mir leid, ich komme nicht drauf!

    Ich komme immer wieder nur auf das selbe Ergebnis wie vorher…
    Kannst du mir nen Ansatz schreiben?
  4. Dark Ranger

    Dark Ranger Erfahrenes Mitglied

    PHP:
    1. if(is_dir($path.$part) && !preg_match('/^(.|..)$/i', $part, $hit))
    2.             {
    3.             readdirs($path.$part.'/', $array);
    4.             }
    5.         }
    Schau dir den Textabschnitt mal an, deine readdirs Funktion liefert ein Array zurück, du machst aber nichts mit dem Rückgabewert. Du musst also den Rückgabewert mit dem Array zusammenführen, welches du bereits in deiner readdirs Funktion hast.
  5. Metha

    Metha Grünschnabel

    Ok, wie dumm von mir! Nun läuft die Funktion – und Danke für die Hilfe!

    Wen es interessiert:

    PHP:
    1. function readdirs($path, $value=NULL)
    2.     {
    3.     $array=array();
    4.     if(is_array($value))
    5.         {$array=array_merge($array, $value);}
    6.  
    7.     $entrys=scandir($path);
    8.     foreach($entrys as $part)
    9.         {
    10.         if(is_dir($path.$part) && !preg_match('/^(.|..)$/i', $part, $hit))
    11.             {
    12.             if(preg_match('/^\[t\]_(.+)/i', $part, $hit))
    13.                 {$array[]=array('path' => $path.$hit[0], 'name' => $path.$hit[1]);}
    14.             $array=readdirs($path.$part.'/', $array);
    15.             }
    16.         }
    17.     return($array);
    18.     }
  6. Gumbo

    Gumbo Erfahrenes Mitglied

    Falls du das Ganze iterativ und nicht rekursiv lösen möchtest:
    Code (PHP):
    1. function readdirs($path)
    2. {
    3.     $path = realpath($path);
    4.     if (!$path) {
    5.         return false;
    6.     }
    7.     $stack = array($path);
    8.     $matches = array();
    9.     while ($path = array_pop($stack)) {
    10.         $dh = opendir($path);
    11.         while ($file = readdir($dh)) {
    12.             if ($file == '.' || $file == '..') {
    13.                 continue;
    14.             }
    15.             if (is_dir($path.'/'.$file)) {
    16.                 if (preg_match('/^\[t\]_(.+)/i', $file, $match)) {
    17.                     $matches[] = array(
    18.                         'path' => $path.'/'.$file,
    19.                         'name' => $path.'/'.$file,
    20.                     );
    21.                 }
    22.                 array_push($stack, $path.'/'.$file);
    23.             }
    24.         }
    25.     }
    26.     return $matches;
    27. }

Diese Seite empfehlen