Verstehe Funktion zum rekursiven Auslesen von Verzeichnissen nicht ganz

Html

Erfahrenes Mitglied
Guten morgen... Lerne im Moment php und bin gerade auf eine Funktion gestoßen mit der ich ein Verzeichnis mit samt Unterverzeichnis auslesen kann.

PHP:
<? 
 
   function read_recursiv($path) 
   { 
      $result = array();

      $handle = opendir($path); 

      if ($handle) 
      { 
         while (false !== ($file = readdir($handle))) 
         { 
             if ($file != "." && $file != "..") 
             { 
                $name = $path . "/" . $file;
                if (is_dir($name))
                { 
                   $ar = read_recursiv($name);
                   foreach ($ar as $value)
                   {
                      $result[] = $value;
                   }
                } 
                else 
                { 
                   $result[] = $name;
                } 
             } 
         } 
      } 
      closedir($handle);
      return $result; 
   } 

   $data = read_recursiv("."); 
 
   echo "<b>" . count($data) . "Dateien gefunden</b><br>\n";
   foreach($data as $value)
     echo "$value<br>\n"; 
?>


Die Funktion funktioniert so weit nur steige ich da nicht ganz durch. Möchte das gerne verstehen und frage daher ob mir jemand diese Funktion etwas genauer erklären kann und /oder kommentieren.

Vielen Dank, Olli
 
Zuletzt bearbeitet:
Guten Morgen Oli

Ich denke es ist am einfachsten, wenn ich den Code kopiere und dir die Erklährungen gleich in den Code schreibe. Usführliche Erklährungen und Beispiele findest du in der Doku von PHP. http://www.php.net

PHP:
<?  
read_recursiv(lieder); //Funktion read_recursiv aufrufen der Pfad Lieder wird übergeben 
  
   function read_recursiv($path)  //Beginn Funktion in Klammern wird die Variable für den übergeben Wert festgelegt.
   {  
      $result = array(); //Resultat in ein Array schreiben

      $handle = opendir($path);  //Ordner "Lieder" öffnen

      if ($handle)  //Prüfen ob Variable $handle nicht leer ist
      {  
         while (false !== ($file = readdir($handle)))  //While schleife für jedes einzelne Element im Ordner
         {  
             if ($file != "." && $file != "..")  //Wenn Dateiname ungleich "." oder ".." ist
             {  
                $name = $path . "/" . $file; //Name erstellen aus pfad und dateiname
                if (is_dir($name)) //Wenn der Name ein Ordner ist dann die Funktion nochmals aufrufen
                {  
                   $ar = read_recursiv($name); //Resultat wird in Array "$ar" geschrieben
                   foreach ($ar as $value) //Schleiffe um das Array auszulesen
                   { 
                      $result[] = $value; //Aktuelle Schleife in $result speichern
                   } 
                }  
                else  //Wenn kein Ordner dann
                {  
                   $result[] = $name; //Name in $result speichern
                }  
             }  
         }  
      }  
      closedir($handle); //Ordner schliessen
      return $result;  //$result als Rückgabewert der Funktion
   }  

   $data = read_recursiv(".");  
  
   echo "<b>" . count($data) . "Dateien gefunden</b><br>\n"; 
   foreach($data as $value) 
     echo "$value<br>\n";  
?>

Ich hoffe ich konnte dir ein bisschen Helfen!

Gruss

Scan
 
Super, jetzt bin ich um einiges schlauer... Aber vielleicht kannst du mir folgenden Teil noch ein Tick genauer erkläre-das verstehe ich noch nicht so ganz!


PHP:
if (is_dir($name)) //Wenn der Name ein Ordner ist dann die Funktion nochmals aufrufen
                {  
                   $ar = read_recursiv($name); //Resultat wird in Array "$ar" geschrieben
                   foreach ($ar as $value) //Schleiffe um das Array auszulesen
                   { 
                      $result[] = $value; //Aktuelle Schleife in $result speichern
                   } 
                }

Vielen Dank
 
Super, jetzt bin ich um einiges schlauer... Aber vielleicht kannst du mir folgenden Teil noch ein Tick genauer erkläre-das verstehe ich noch nicht so ganz!


PHP:
if (is_dir($name)) //Wenn der Name ein Ordner ist dann die Funktion nochmals aufrufen
                {  
                   $ar = read_recursiv($name); //Resultat wird in Array "$ar" geschrieben
                   foreach ($ar as $value) //Schleiffe um das Array auszulesen
                   { 
                      $result[] = $value; //Aktuelle Schleife in $result speichern
                   } 
                }

Vielen Dank

Ein Inhalt in einem Ordner kann entweder noch ein Orner oder eine Datei sein.
Das ganze prüft nun, ob das derzeitige item ein Ordner ist. Wenn ja, dann soll er diese Funktion mit dem Ordner durchsuchen erneut starten, bevor er die anderen Inhalte auflistet.
Sollte das Objekt kein Ordner sondern eine Datei sein, schreibt er sie in die Dateilist emit rein (als Array).
 
Hi,

PHP:
if (is_dir($name)) //Wenn der Name ein Ordner ist dann die Funktion nochmals aufrufen 
                {   
                   $ar = read_recursiv($name); //Resultat wird in Array "$ar" geschrieben 
                   foreach ($ar as $value) //Schleiffe um das Array auszulesen 
                   {  
                      $result[] = $value; //Aktuelle Schleife in $result speichern 
                   }  
                }

Ich denke mal du meinst die foreach-schleife...

Mit foreach wird jeder Wert des Arrays vorrübergehend einer Variable zugeordnet
Der Name der Variable wird durch den Befehl as angegeben.

$as ist die Variable und $value die vorläufige Variable.

Die Schleife packt jeden Eintrag des Arrays in die Variable $value.

Die einzelnen Werte kannst du später dann mit $result[0], $result[1], $result[2], etc. aufrufen. :)

Ein nützlicher Link: http://www.schattenbaum.net/php/array.php

Gruss
Commi
 
Hallo

ich möchte kurz das zusammenfassen was meine "vorredner":) gesagt haben...
Der Inhalt eines Ordners kann entweder ein Ordner oder eine Datei sein. Um zu prüfen ob das aktuelle Elemente, welches gerade von in der Schleife ist, ein Ordner (also ein Unterordner) gibts folgender Befehl
PHP:
is_dir(string pfad)
. Wenn das Element jetzt ein Ordner ist wird in der if Schleife wieder die Funktion read_recursiv aufgerufen.
Das Resultet der Funktion wird in die Variable $ar gespeichert.
mit der foreach schleife wird jedes Element des Arrays ($ar) vorübergehend in eine variable ($value) gespeichert.
Danach wird es in das Array $result gespeichert.
 
Also habe den Code jetzt noch etwas getestet. Nun möchte ich den Code noch etwas modifizieren:
Er soll mir nur die Dateien mit einer bestimmten Endung liefern(z.b mp3).

Wie und wo muss ich das einfügen?


Wäre klasse wenn mir da noch jemand helfen kann


Olli
 
mit 2 Befehlen... zum einen strrpos() um herauszufinden an welcher stelle im dateinamen der '.' ist der die extension abtrennt.

Und zum 2. substr() um sie aus dem string "auszuschneiden"

aussehen tut das ganze so zB:

PHP:
<?
$test = 'blablalba.mp3';

$ext  = strtolower(substr($test, strrpos($test,'.')+1));

echo $ext;
?>

PS: Ich habe noch ein strtolower eingebaut das .MP3 das gleiche ist wie .mp3
 
Zurück