2013-05-05 69 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); 
    } 
}