2013-06-24 68 views
0

我寫下了這個簡單的函數,在一個數組上存在目錄和子目錄中的所有文件,但它不起作用。當我回應$f什麼都沒有顯示。 我哪裏錯了?遞歸地使用函數來列出目錄和子目錄中的所有文件

define('ROOT_DIR', __DIR__); 

function scanSubDir($w_dir){ 
    $dir = scandir($w_dir); 

    foreach($dir as $f){ 
     if($f != '..' || $f != '.'){ 
      if(is_file($w_dir.$f)){ 
       $list[] = $f; 
      }elseif(is_dir($w_dir.$f)){ 
       scanSubDir($w_dir.$f); 
      } 
     } 
    } 
    return $list; 
} 

$file = scanSubDir(ROOT_DIR.'/test/'); 

foreach($file as $f){ 
    echo $f; 
} 
+0

因爲'$ dir'是SCANDIR結果數組您不能追加'$ dir'和'$ F'。 – mario

+0

其中之一,你在你的函數中硬編碼目錄('$ dir = scandir(ROOT_DIR。'/ test /');') - 所以它只會掃描那個目錄。另一方面,當您進行遞歸調用時,實際上並沒有向$ list添加任何內容。 – andrewsi

+1

可能重複的[PHP - 遞歸搜索目錄中的所有文件夾路徑](http://stackoverflow.com/questions/7938680/php-recursively-search-within-a-directory-for-all-folder-paths) – mario

回答

0

修復代碼:

function scanSubDir($w_dir){ 
    $dir = scandir($w_dir); 

    $list = array(); // <-- create initially empty list of files 
    foreach($dir as $f){ 
     if($f != '..' || $f != '.'){ 
      if(is_file($dir.$f)){ 
       $list[] = $f; 
      }elsif(is_dir($dir.$f)){ 
       $sublist = scanSubDir($dir.PATH_SEPARATOR.$f); // <-- include path separator! 
       $list = array_merge($list, $sublist); // <-- merge the result of the recursive call 
      } 
     } 
    } 
    return $list; 
} 

需要注意的是:

  • 結果列表中只包含文件名,沒有路徑。你的情況可能是好的或不好的。例如,對於以下的目錄結構:

    dir 
    |_ subdir 
    | |_ file.txt 
    | |_ file.jpg 
    |_ file.txt 
    

    結果將是:array('file.txt', 'file.jpg', 'file.txt')(數組元素的順序可以不同)。 請注意,'file.txt'來了兩次,沒有路徑信息。

  • 符號/硬鏈接可能會產生無限遞歸,導致堆棧溢出:) 如果您的目錄需要包含鏈接,您可能需要考慮這一點。

0

試試這個:

<?php 
function _scandir($dir = '.', $files = array()) 
{ 
    foreach(glob($dir . '/*') as $file) { 
     if(is_file($file)) { 
      $files[] = $file; 
     }else{ 
      $files = array_merge($files, _scandir($file)); 
     } 
    } 
    return $files; 
} 
?> 

<pre> 
<?php print_r(_scandir()); ?> 
</pre> 
+0

糟糕的解決方案,這可以通過使用PHP的目錄迭代器的3行代碼實現。 –

相關問題