PHP7中提供了一个关键的递归式目录迭代器RecursiveDirectoryIterator。使用该迭代器可以递归式遍历指定路径下的所有文件。
先看一下该迭代器的构造器:
public RecursiveDirectoryIterator::__construct
( string $path[, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO] )
该构造器的核心就是$path,即遍历的基路径。第二个参数flag会影响某些方法的行为。
下面给出例子:
递归式遍历目录下的指定文件
首先说一下最终想得到的效果:按照linux和windows显示文件路径的命令ls和dir,我们可以调用类中的ls和dir命令来遍历文件。
$class->ls("*.php"):查找后缀为*.php的文件并以Linux中的形式展示
$class->dir("*.php"):以windows中的形式展示
这里又有一些问题,RecursiveDirectoryIterator通过foreach遍历得到的是多维数组,比较麻烦无法直接输出;对得到的文件如何进行过滤?
这就引入了另外两个迭代器RecursiveIteratorIterator和RegexIterator:
- RecursiveIteratorIterator:深层次迭代器,通过迭代器作为参数传入构造器,在foreach遍历时可以直接得到指定对象SplFileObject。
public RecursiveIteratorIterator::__construct
( Traversable $iterator[, int $mode=RecursiveIteratorIterator::LEAVES_ONLY[, int $flags = 0]] )
- RegexIterator:构造器中具有两个参数,迭代器和正则表达式字符串,可以过滤指定元素。
public RegexIterator::__construct
( Iterator $iterator, string $regex[, int $mode = self::MATCH[,int $flags = 0[, int $preg_flags = 0]]] )
- SplFileObject对象:可以得到文件的各种信息
foreach($recursiveDirectoryIterair as $key =>$value);
//$key为得到文件的完整路径,$value为SplFileObject对象
思路:将RecursiveDirectoryIterator作为参数传入RecursiveIteratorIterator,将RecursiveIteratorIterator作为参数传入RegexIterator,最后遍历得到SplFileObject对象,获取信息输出即可。
代码: