Verstehe Funktion zum rekursiven Auslesen von Verzeichnissen nicht ganz

PHP:
                else  //Wenn kein Ordner dann
                {  
                    if(strtolower(substr($name, strrpos($name,'.')+1)) == 'mp3')
                    $result[] = $name; //Name in $result speichern  
                }
 
Jetzt verstehe ich wieder nur Bahnhof... Habe gedacht ich hätte die Funktion verstanden...

Also dein letzter Schritt ist mir noch klar. Aber warum muss die Abfrage nicht auch in diesen Teil:


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 
                   }  
                }


Wenn ich die foreach Schleife ausblende erhalte ich nur die Dateien im Ordner lieder. Also
befinden sich in $ar alle Dateien in den Unterverzeichnissen. Warum ist dann hier keine
Abfrage nötig

Bitte erklärt mir das nochmal
 
Weil dieser Teil ja nur wieder mittels
PHP:
$ar = read_recursiv($name);
das entsprechende Unterverzeichnis aufruft. In der Funktion read_recursiv() wird dann ja wieder für jedes einzelne Element geprüft, obs ein Ordner oder eine Datei ist. Nämlich mittels
PHP:
if (is_dir($name))
und dann wird für eine Datei ja wieder in den else-Fall gesprungen...

Die Rekursion hats schon manchmal in sich ;)

Gruß, Dom
 
Ja gut aber wenn ich diese Zeile:
PHP:
$result[] = $value; //Aktuelle Schleife in $result speichern
rauslasse, erhalte ich nur die Dateien im ersten Ordner lieder...


?
 
Hallo

Ja das ist eine möglichkeit! Es gibt da aber eine schönere:

PHP:
if (!is_dir($name)) //Wenn der Name ein Ordner ist dann die Funktion nochmals aufrufen 
                {   
                   $result[] = $name;
                }

1. Du fügst bei der If Anweisung vor is_dir($name) ein ! ein. Damit erreichst du das das Resultat der Funktion is_dir() Null sein muss damit die If Anweisung durchgeführt wird.
2. Du änderst den Inhalt auf
PHP:
$result[] = $name;
3. Der Else Teil löscht du komplett.

Hiermit hast du erreich, dass der Name nur in das Array $result eingefügt wird wenn es kein Ordner ist.
 
Aber dieser Code soll doch wenn ich das richtig verstanden habe mir ein Verzeichnis samt aller Unterverzeichnissen auslesen und alle Dateien und Ordnername auflisten.

Jedoch erhalte ich mit folgendem Code nur die Dateinamen und nicht die Namen der Unterordner.

PHP:
<?  

  
   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
                
				{  
                   $ext  = strtolower(substr($name, strrpos($name,'.')+1)); //Dateiendung filtern
					
					if($ext=="mp3"){ //nur Endung: mp3 zulassen
				
				  
				  
				   $result[] = $name; //Name in $result speichern
                }
				}  
             }  
         }  
      }  
      closedir($handle); //Ordner schliessen
      return $result;  //$result als Rückgabewert der Funktion
   }  

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

Oder verstehe ich da was falsch. In dem array result werden einmal mit value die Ordner geschrieben und mit name die Dateien, oder etwa nicht?
 
Hi

Das ist richtig mit der Code Änderung welche ich dir gesendet habe bekommst du nur die Dateien ohne Unterordner.
Wenn du alle Daten auch aus den Unterordner bekommen möchtest dann must du das Script welches du ganz am Anfange gepostet hast benutzen.
Und wenn du sämtliche Dateien plus die Namen der Unterordner ausgeben möchtest musst du dieser Code
PHP:
 $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 
                    
                   }
ersetzen mit
PHP:
$result[] = $value;

Dann bekommst du ein Array welches sämtliche Dateien des Ordners und die Namen der Unterordner(ohne Dateinamen).
Wenn das nicht das richtige ist dann verstehe ich dein Anliegen nicht.
 
Ich möchte zuerst mal den Code verstehen. Lerne gerade php und taste mich langsam daran.

Wie muss der Code aussehen damit er mir alle Dateien (auch die in Unterordnern) im Verzeichnis z.b Lieder anzeigt und die Namen der Unterordner anzeigt. Ich dachte mein zu erst geposteter Code macht dieses, doch er gibt mir lediglich die Dateine aller Ordner und Unterordner an....

Ich verstehe das ja nicht so richtig, denn wofür ist dieses Code Teil:

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

Tut mir leid wenn ich mich bisschen unglücklich ausdrücke. Aber möchte zunächst mal den Code verstehe und anwenden können.

Gruß olli
 
Hi,

Also ich erklähre dir erstmal den Code, das andere können wir ja noch später anschauen!
PHP:
$ar = read_recursiv($name);

Diese Zeile führt die Funktion reas_recursiv() aus. als Parameter wird die Variable $name übergeben. Diese Funktion läuft durch und das Ergebnis (also das Array $result).
Viele Funktionen würde ja keine Sinn ergeben wenn sie keine Werte zurückgeben. Das ist etwa das gleiche wie wenn du Beispielsweise eine Zahl rundest erhälst du auch eine Rückgabewert aus der Funktion rund().

PHP:
$result[] = $value;
Um die Werte der Funktion read_recursiv() zu den anderen Dateinamen hinzuzufügen muss das Array $ar in das Array $result geschrieben werden.
Da eigentlich kein Array in ein anderes geschrieben werden kann müssen wir die Array Inhalte in ein String umwandeln und das tun wir mit:
PHP:
foreach ($ar as $value)
Diese Funktion liest das Array Wert für Wert aus und speichert es in diesem Fall unter der Variabel $value.
Diesen String speichern wir dann wieder in das Array $result.

Ich hoffe ich konnte dir das etwas näher bringen. Es ist nicht ganz einfach zu erklähren aber mit ein bisschen ausprobieren wirst du es sicher das ganz rausbekommen!

Und sonst einfach wieder nachfragen.;)
 
Also ich denke das ich den code zu 90% verstanden habe.

Nur mit einer kleinen Änderung des Codes komme ich trotzdem nicht weiter:
Ich möchte immer nur eine Datei in allen Ordnern auslesen. D.h in jedem ordner den die Funktion findet soll lediglich die erste vorkommender Datei ausgelesen werden.

Wie ist das möglich?


Danke ,Olli
 
Zurück