我发现我可以使用php中的以下代码获取该文件夹的所有子目录
$address = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::SELF_FIRST,
RecursiveIteratorIterator::CATCH_GET_CHILD // Ignore "Permission denied"
);
并将其放入$地址。
如何添加另一个条件并说明子目录中是否包含'tmp'文件夹,然后将其放在$地址中?
答案 0 :(得分: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;
}
}
答案 1 :(得分: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
...
什么不是。使用的过滤器迭代器相对简单,对于每个条目,检查它是否具有该子目录。重要的是你为此启用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);
}
}