2017-10-07 167 views
0

我試圖創建一個返回全部由他們在分組目錄中的文件的遞歸函數。我的文件結構是這樣的遞歸PHP陣列出現故障

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

,我希望得到的數組是

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 

雖然回聲的我已經表明,它發現所有這些,最終陣列看起來像這樣:

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

因此文件沒有被存儲在數組中,或者被覆蓋,但是我找不到這個錯誤。有人請指出嗎?我的功能如下。

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

如果在一個目錄中是一個文件夾和一個文件呢? – Webdesigner

+0

你可以發佈你如何調用'getAllFiles()'和你正在得到的輸出/錯誤嗎? –

+0

最初的調用只是GetAllFiles($ dir);輸出顯示在我的問題中。 – user3052443

回答

1

這工作後,我做了一些修改:

<?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')); 

鑑於文件樹:

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 

它產生的輸出:

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 
) 

基本上是:

[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

如果我在文件上增加$ idx,它將不會將所有文件與包含它們的目錄分組。 – user3052443

+0

??如果您嘗試在主目錄中創建另一個目錄,它的代碼將搜索一個目錄,它將添加它,但它不會在while循環開始時根據if語句添加任何文件 – Osama

+0

並且idx的增量必須爲while循環的結尾 – Osama