2013-05-05 67 views
3

我發現,我可以得到該文件夾​​的所有子目錄下面的代碼在PHP如何獲得在PHP中具有特定文件夾名稱的所有子目錄?

$address = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS), 
RecursiveIteratorIterator::SELF_FIRST, 
RecursiveIteratorIterator::CATCH_GET_CHILD // Ignore "Permission denied" 
); 

,並把它放在$地址。

如何添加一個標準並說明子目錄中是否有'tmp'文件夾,然後將其放在$地址中?

+0

澄清:你想/路徑/到地址或/路徑/到/ tmp。 「放在$地址中」中的「it」有點含糊不清。 – Gordon 2013-05-05 21:26:24

+0

path/to/tmp address – wikinevis 2013-05-05 21:28:52

+1

@wikinevis在'/ path/to'中的意思是無效的,因爲它在路徑中有'tmp'?因爲'path/to/tmp'也顯示'path/to /'裏面有文件夾.....可以通過示例輸出 – Baba 2013-05-05 21:33:21

回答

4

您可以創建自己的RecursiveFilterIterator

$dir = new RecursiveDirectoryIterator(__DIR__, 
     RecursiveDirectoryIterator::SKIP_DOTS); 

$address = new RecursiveIteratorIterator(new TmpRecursiveFilterIterator($dir), 
     RecursiveIteratorIterator::SELF_FIRST, 
     RecursiveIteratorIterator::CATCH_GET_CHILD); 


foreach($address as $dir) { 
    echo $dir,PHP_EOL; 
} 

類用於

class TmpRecursiveFilterIterator extends RecursiveFilterIterator { 
    public function accept() { 
     $file = $this->current(); 
     if ($file->isDir()) { 
      return is_dir("$file/tmp"); 
     } 
     return false; 
    } 
} 
+4

+1來更新你的答案是完全正確的(如果沒有,需要)。我並不是100%的代碼,但我非常喜歡這種風格。首先,任何一種'FilterIterator'都可以,'RecursiveFilterIterator'也是。也使用PHP的標準lib *裏面的函數*對象抽象(這裏:'is_dir')是完全有效的。特別是因爲SplFileInfo是Spl的一部分,它是標準PHP庫(SPL)的重新體現。好極了!那麼我還能說些什麼呢?變量用法!做得好,PHP有COW,所以只需像'$ file'這樣使用變量。這一切都很好! – hakre 2013-05-06 01:20:17

+0

這是一個要記住很久的評論..... :) – Baba 2013-05-06 01:24:47

3

你或許可以通過創建自己FilterIterator用於檢查一個子目錄添加的標準。下面的用法示例演示瞭如何列出我在git下的文件夾。

$address是你有你的問題已經,過濾器只是增加了圍:

$filtered = new SubDirFilter($address, '.git'); 

foreach ($filtered as $file) { 
    echo $filtered->getSubPathname(), "\n"; 
} 

輸出:

Artax 
CgiHttpKernel 
CgiHttpKernel/vendor/silex/silex 
... 
composer 
composer-setup 
CVBacklog 
... 

,什麼不是。這個filter-iterator使用比較簡單,對於每一個條目都會檢查它是否有該子目錄。重要的是,你有這個(你有)啓用FilesystemIterator::SKIP_DOTS否則你將得到重複的結果(表達相同的目錄):

class SubDirFilter extends FilterIterator 
{ 
    private $subDir; 

    public function __construct(Iterator $iterator, $subDir) { 
     $this->subDir = $subDir; 
     parent::__construct($iterator); 
    } 

    public function accept() { 
     return is_dir($this->current() . "/" . $this->subDir); 
    } 
}