2017-10-07 2 views
0

Ich versuche, eine rekursive Funktion zu erstellen, die von dem Verzeichnis sind sie in gruppiert alle Dateien zurückgibt. Meine Dateistruktur ist wie dieserrekursive PHP-Array ausfällt

. 
|-- Dir A 
| +-- file 1 
| +-- file 2 
|-- Dir B 
| +-- file 11 
| +-- file 12   

und ich möchte das resultierende Array

array[0][0] = Dir A 
array[0][1] = file 1 
array[0][2] = file 2 

array[1][0] = Dir B 
array[1][1] = file 11 
array[1][2] = file 12 
sein

Während die Echos ich nachweisen, dass es alle diejenigen findet, die endgültige Anordnung wie folgt aussieht:

array[0][0] = Dir A 
array[1][0] = Dir B 

Also die Dateien werden nicht im Array gespeichert oder vielleicht überschrieben, aber ich kann den Fehler nicht finden. Würde jemand bitte darauf hinweisen? Meine Funktion ist unten.

function GetAllFiles($dir = '.', $fileArray = '', $idx = -1){ 

    if ($fileArray == '') $fileArray = array(); 

     if(is_dir($dir)) { 
     if($dh = opendir($dir)){ 
      while($file = readdir($dh)) { 
       if($file != '.' && $file != '..'){ 
        if(is_dir($dir . $file)){ 
         $idx++; 
         echo 'A '.$idx . ' - ' .$dir . $file.'<br>'; 
         $fileArray[$idx][] = $dir . $file; 
         GetAllFiles($dir . $file . '/', $fileArray, $idx); 
        }else{ 
         echo 'B '.$idx. ' - ' .$dir . $file.'<br>'; 
         $fileArray[$idx][] = $dir . $file; 
        } 
       } 
       } 
      } 
      closedir($dh);   
     } 

     return  $fileArray; 
    } 
+0

Was ist, wenn in einem Verzeichnis ein Ordner und eine Datei ist? – Webdesigner

+0

Kannst du posten, wie du 'getAllFiles()' nennst, und die Ausgabe/den Fehler bekommst du? –

+0

Der erste Aufruf ist nur GetAllFiles ($ dir); Die Ausgabe wird in meiner Frage angezeigt. – user3052443

Antwort

1

Dies funktioniert, nachdem ich ein paar Änderungen vorgenommen:

<?php 

function GetAllFiles($dir) { 
    $fileTree = []; 

    if (is_dir($dir) && ($dh = opendir($dir))) { 
     while ($node = readdir($dh)) { 
      if (is_dir($dir . '/' . $node)) { 
       if(!in_array($node, ['.', '..'])) { 
        $fileTree[] = GetAllFiles($dir . '/' . $node); 
        array_unshift($fileTree[count($fileTree)-1], $node); 
       } 
      } else { 
       $fileTree[] = $node; 
      } 
     } 
     closedir($dh); 
    } 

    return $fileTree; 
} 

print_r(GetAllFiles('tree')); 

Da Baum-Datei:

tree 
tree/file1 
tree/file2 
tree/folder1 
tree/folder1/file11 
tree/folder1/file12 
tree/folder2 
tree/folder2/file21 
tree/folder2/file22 
tree/folder2/folder23 
tree/folder2/folder23/file231 
tree/folder2/folder23/file233 
tree/folder2/folder23/file232 

es produziert, dass die Ausgabe:

Array 
(
    [0] => file2 
    [1] => Array 
     (
      [0] => folder1 
      [1] => file11 
      [2] => file12 
     ) 

    [2] => Array 
     (
      [0] => folder2 
      [1] => Array 
       (
        [0] => folder23 
        [1] => file231 
        [2] => file233 
        [3] => file232 
       ) 

      [2] => file21 
      [3] => file22 
     ) 

    [3] => file1 
) 

das ist im Grunde:

[0] => file2 
[1][0] => folder1 
[1][1] => file11 
[1][2] => file12 
[2][0] => folder2 
[2][1][0] => folder23 
[2][1][1] => file231 
[2][1][2] => file233 
[2][1][3] => file232 
[2][2] => file21 
[2][3] => file22 
[3] => file1 
0
echo 'B '.$idx. ' - ' .$dir . $file.'<br>'; 
array_push($[$idx],$dir.$file); 
+0

Wenn ich $ idx für eine Datei inkrementiere, werden nicht alle Dateien mit dem Verzeichnis gruppiert, das sie enthält. – user3052443

+0

?? Ihr Code sucht nach einem Verzeichnis, wenn Sie versuchen, ein anderes Verzeichnis im Hauptverzeichnis anzulegen, es wird es hinzufügen, aber es wird keine Datei entsprechend der if-Anweisung am Anfang der while-Schleife hinzufügen – Osama

+0

Und das Inkrement von idx muss bei sein das Ende der while-Schleife – Osama