2012-07-26 46 views
0

我有一個函數,它返回文件夾遞歸中的文件數組。Opendir獲取子文件夾中的文件前的文件數組

protected function getFiles($base) { 

    $files = array();  
    if(!is_dir($base)) return $files; 

    if (($handle = opendir($base)) != false) { 
     while (false !== ($file = readdir($handle))) { 
      if ($file == "." || $file == "..") continue; 

      if(is_dir("$base/$file")) {     
       $subfiles = $this->getFiles("$base/$file"); 
       $files = array_merge($files, $subfiles);      
      } else {      
       if(File::type($file,false) == "xml") 
        $files[] = "$base/$file"; 
      } 
     } 
     closedir($handle); 
    } 

    return $files; 
} 

我該如何修改它,以便它總是在任何子文件夾之前列出根文件?目前默認情況下,文件夾始終優先。

回答

0

只需創建子目錄,而你循環目錄指針數組,並在最後迭代目錄的數組:

protected function getFiles($base) { 

    $files = $dirs = array();  
    if(!is_dir($base)) return $files; 

    if (($handle = opendir($base)) != false) { 

     while (false !== ($file = readdir($handle))) { 
      if ($file == "." || $file == "..") continue; 

      if(is_dir("$base/$file")) {  
       $dirs[] = "$base/$file"; 
      } else {      
       if(File::type($file,false) == "xml") 
        $files[] = "$base/$file"; 
      } 
     } 
     closedir($handle); 

     foreach ($dirs as $dir) { 
      $subfiles = $this->getFiles($dir); 
      $files = array_merge($files, $subfiles);      
     } 

    } 

    return $files; 
} 
0

使用兩個數組一個在當前文件夾,一個用於文件那些在子文件夾中的人就會合並它們。

protected function getFiles($base) { 

    $files = array();  
    $subFiles = array();   
    if(!is_dir($base)) return $files; 

    if (($handle = opendir($base)) != false) { 
     while (false !== ($file = readdir($handle))) { 
      if ($file == "." || $file == "..") continue; 

      if(is_dir("$base/$file")) {     
       $subFiles = array_merge($subFiles, $this->getFiles("$base/$file"));     
      } else {      
       if(File::type($file,false) == "xml") 
        $files[] = "$base/$file"; 
      } 
     } 
     closedir($handle); 
    } 

    return array_merge($files, $subFiles); 
} 
1

您可能想看看PHP SPL DirectoryIterator類。您可以實例化對象,然後快速迭代以分割出目錄與文件與鏈接,併爲每個對象獲取完整的SplFileInfo對象(這使得獲取關於文件的任何信息都很容易)。

$directory = '/path/to/directory'; 
$iterator = new DirectoryIterator($directory); 
$dirs = array(); 
$files = array(); 
$links = array(); 

foreach($iterator as $obj) { 
    if($obj->isFile()) { 
     $files[] = $obj; 
    } else if ($obj->isDir()) { 
     $dirs[] = $obj; 
    } else if ($obj->isLink()) { 
     $links[] = $obj; 
    } 
} 

對不起剛剛意識到你想遞歸地做。那麼使用RecursiveDirectoryIterator,但概念是相同的。

相關問題