2011-04-24 22 views
10

我有這個工作功能,找到文件夾並創建一個數組。獲取文件夾與PHP glob - 無限級深

function dua_get_files($path) 
{ 
    foreach (glob($path . "/*", GLOB_ONLYDIR) as $filename) 
    { 
     $dir_paths[] = $filename; 
    } 
    return $dir_paths; 
} 

該函數只能找到當前位置上的目錄。我想查找子文件夾及其子項中的目錄路徑等。

該數組仍然應該是目錄路徑的平面列表。

的輸出數組應該怎麼看起來像

$dir_path[0] = 'path/folder1'; 
$dir_path[1] = 'path/folder1/child_folder1'; 
$dir_path[2] = 'path/folder1/child_folder2'; 
$dir_path[3] = 'path/folder2'; 
$dir_path[4] = 'path/folder2/child_folder1'; 
$dir_path[5] = 'path/folder2/child_folder2'; 
$dir_path[6] = 'path/folder2/child_folder3'; 

回答

14

如果你想上的目錄遞歸調用一個例子,你應該看看RecursiveDirectoryIterator

$path = realpath('/etc'); 

$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST); 
foreach($objects as $name => $object){ 
    echo "$name\n"; 
} 
+0

是的,工作。我編輯並添加了代碼供其他人在您的答案中查看。 – 2011-04-24 08:45:58

+0

爲什麼RecursiveDirectoryIterator類?查看我的回答 – 2011-04-24 08:54:19

+0

@Davood因爲使用該迭代器,不需要自己執行遞歸;-) ;; @Jens您的修改正在等待批准,並且需要再次顯示「批准投票」;如果它很快就不被批准,我會編輯自己,添加您發佈的內容;謝謝 ! – 2011-04-24 08:55:45

4

試試這個:

function dua_get_files($path) 
{ 
    $data = array(); 
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST); 

    foreach ($files as $file) 
    { 
     if (is_dir($file) === true) 
     { 
      $data[] = strval($file); 
     } 
    } 

    return $data; 
} 
+0

Downvote,因爲這根本不使用glob。 – 2014-02-20 16:09:55

+0

@DennisMeissner:既不是接受的答案,但顯然它完成了這項工作。使用glob來完成這個任務只是無稽之談。 – 2014-02-20 18:05:28

1

使用此功能:

function dua_get_files($path) 
{ 
    $dir_paths = array(); 
    foreach (glob($path . "/*", GLOB_ONLYDIR) as $filename) 
    { 
     $dir_paths[] = $filename; 
     $a = glob("$filename/*", GLOB_ONLYDIR); 
     if(is_array($a)) 
     { 
      $b = dua_get_files("$filename/*"); 
      foreach($b as $c) 
      { 
       $dir_paths[] = $c; 
      } 
     } 
    } 
    return $dir_paths; 
} 
2

很奇怪 - 大家的意見遞歸,不過還好只是週期:

$dir ='/dir'; 
while($dirs = glob($dir . '/*', GLOB_ONLYDIR)) { 
    $dir .= '/*'; 
    if(!$result) { 
    $result = $dirs; 
    } else { 
     $result = array_merge($result, $dirs); 
    } 
} 
0

如果您在linux/unix上,你也可以使用backt與find命令舔。文件系統上的目錄搜索可能需要很長時間,並且會出現循環 - 系統find命令已經爲速度和處理文件系統循環而構建。換句話說,與使用php本身搜索文件系統樹相比,系統exec調用可能花費的CPU時間要少得多。

$dirs = `find $path -type d`; 

請記住清理$ path輸入,以便其他用戶不會傳入安全性危害路徑名(例如來自url或其他內容)。

把它放到一個數組

$dirs = preg_split("/\s*\n+\s*/",`find $path -type d`,-1,PREG_SPLIT_NO_EMPTY); 
0

您可以使用PHP GLOB的功能,但你必須創建一個遞歸函數掃描在無限級深度的目錄。然後將結果存儲在全局變量中。

function dua_get_files($path) { 
    global $dir_paths; //global variable where to store the result 
    foreach ($path as $dir) { //loop the input 
     $dir_paths[] = $dir; //can use also "basename($dir)" or "realpath($dir)" 
     $subdir = glob($dir . DIRECTORY_SEPARATOR . '*', GLOB_ONLYDIR); //use DIRECTORY_SEPARATOR to be OS independent 
     if (!empty($subdir)) { //if subdir is not empty make function recursive 
      dua_get_files($subdir); //execute the function again with current subdir 
     } 
    } 
} 

//usage: 
$path = array('galleries'); //suport absolute or relative path. support one or multiple path 
dua_get_files($path); 
print('<pre>'.print_r($dir_paths,true).'</pre>'); //debug