PHP5中增减了Iterator(迭代器),一组有助于导航和处理层级数据的现成接口。这些Iterator显著的减少了处理XML文档树或者文 件集合所需的代码。PHP5中使用大量的Iterator,包括ArrayIterator,CachingIterator,RecursiveIterator,
SimpleXMLIterator,LimitIterator 和DirectoryIterator。
下面主要看看使用迭代器和常规方法来进行文件遍历的不同。
/**
* 任务1:列出一个文件夹中的所有文件
**/
function iteratorScan( $DirToScan)
{
$items = new DirectoryIterator($DirToScan);
foreach($items as $item)
{
if(!$item->isDot())
{
echo $item."<br/>";//这里输出的只是文件的名称,不是全路径
}
}
}
function normalScan($DirToScan)
{
$items = scandir($DirToScan);
foreach($items as $item)
{
if($item != "." And $item !="..")
{
echo $item."<br/>";
}
}
}
/**
* 任务2:递归列出所有的文件和文件夹
**/
function iteratorRecursiveScan($strDirToScan)
{
$item = new RecursiveDirectoryIterator($strDirToScan);
foreach( new RecursiveIteratorIterator($item) as $file)
{
echo $file."<br/>";//注意,这里输出的是全路径
}
}
function normalRecursiveScan($strDirToScan)
{
$handle = opendir($strDirToScan);
while(false !==($file = readdir($handle)) )
{
if($file!="." and $file !="..")
{
$strFilePath = $strDirToScan."\\".$file;
echo $strFilePath."<br/>";
if(is_dir($strFilePath))
{
normalRecursiveScan($strFilePath);
}
}
}
closedir($handle);
}
/**
* 任务3:打印目录树
**/
function iteratorDirTree($strDirToTree)
{
//实际的使用中,并不能用
$items = new DirectoryTreeIterator($strDirToTree);
foreach($items as $item)
{
echo $item."<br/>";
}
}
说明:
任务1二者完成的代码量都差不多。相比之下normalScan完成得比较容易理解。
任务2明显iteratorRecursiveScan的代码少。但对初次使用的迭代器操作的人来说,比较晦涩难懂。
任务3不明原因,代码不能正常执行。可能是php版本的问题


