2010-03-30 56 views
2

嗨我想獲取RecursiveDirectoryIterator類,使用FilterIterator上的擴展名工作,但由於某種原因,它僅在根目錄上迭代。如何使用PHP5遞歸顯示具有特定文件類型的文件夾和子文件夾RecursiveDirectoryIterator類

我的代碼是這樣的。

class fileTypeFilter extends FilterIterator 
{ 
    public function __construct($path) 
    { 
     parent::__construct(new RecursiveDirectoryIterator($path)); 
    } 
    public function accept() 
    { 
     $file = $this->getInnerIterator()->current(); 
     return preg_match('/\.php/i', $file->getFilename()); 
    }  

} 

$it = new RecursiveDirectoryIterator('./'); 
$it = new fileTypeFilter($it); 

foreach ($it as $file) 
{ 
    echo $file; 
} 

我的目錄結構是這樣的。

-Dir1 
--file1.php 
--file2.php 
-Dir2 
--file1.php 

等等等等

但正如我之前所說的類不遞歸遍歷整個目錄結構,並只盯着根。

問題是,如何使用基本的RescursiveDirectoryIterator來顯示文件夾,然後運行FilterIterator來只顯示這些導航器中的php文件?

乾杯

回答

2

的FilterIterator應該接受通過構造另一個迭代器。 爲了發生自動遞歸,您需要使用RecursiveIteratorIterator遍歷RecursiveIterator。你不需要需要,但如果你不這樣做,那麼調用hasChildren()和getChildren()等等的負擔就在你身上。

下面是一個示例。我沒有費力地接受FileTypeFilterIterator的構造函數中的任何參數,儘管如果你想改變正則表達式,這將是一個很好的補充。但是,否則,你不需要定義一個構造函數。

$it = new FileTypeFilterIterator (
    new RecursiveIteratorIterator(
     new RecursiveDirectoryIterator($path), 
     RecursiveIteratorIterator::SELF_FIRST 
    ) 
); 


class FileTypeFilterIterator extends FilterIterator 
{ 
    public function __construct(Iterator $iter) 
    { 
     parent::__construct($iter); 
    } 
    public function accept() 
    { 
     $file = $this->getInnerIterator()->current(); 
     return preg_match('/\.php/i', $file->getFilename()); 
    } 

} 
foreach($it as $name => $object){ 
    echo "$name\n"; 
} 

順便說一下,在這種情況下,你可能也只是使用RegexIterator不是擴展FilterIterator的。

+0

謝謝克里斯,很想挑選你的大腦這個東西! :) – Jared 2010-03-30 20:18:26

相關問題