PHP排序文件递归DirectoryIterator
我使用下面的代码列出了我子目录中的文件PHP排序文件递归DirectoryIterator,php,sorting,recursion,spl,Php,Sorting,Recursion,Spl,我使用下面的代码列出了我子目录中的文件 // Create recursive dir iterator and skip the dot folders $dir = new RecursiveDirectoryIterator('.', FilesystemIterator::SKIP_DOTS); // Folders come before their files $file = new RecursiveIteratorIterator($dir, RecursiveIterato
// Create recursive dir iterator and skip the dot folders
$dir = new RecursiveDirectoryIterator('.',
FilesystemIterator::SKIP_DOTS);
// Folders come before their files
$file = new RecursiveIteratorIterator($dir,
RecursiveIteratorIterator::SELF_FIRST);
// Maximum depth is 2
$file->setMaxDepth(2);
// Pull out all the xml files that don't contain numbers or special characters
foreach ($file as $fileinfo) {
if ($file->isFile()&& preg_match("/^[a-z]+\.xml/i",$file->getFilename())) {
$linkname = simplexml_load_file($file->getSubPath().'/'.$file->getFilename());
echo '<li><a href="'. $file->getSubPath().'/'.$file->getFilename().'">'. $linkname->name .'</a> -' . date('Y-m-d',filemtime($file->getPathName())) . '</li>';
}
}
//创建递归目录迭代器并跳过点文件夹
$dir=新的递归DirectoryIterator('.'',
文件系统发射器::跳过点);
//文件夹在其文件之前
$file=新的递归迭代器($dir,
递归迭代器::SELF_优先);
//最大深度为2
$file->setMaxDepth(2);
//拉出所有不包含数字或特殊字符的xml文件
foreach($fileinfo形式的文件){
如果($file->isFile()和&preg_匹配(“/^[a-z]+\.xml/i,$file->getFilename())){
$linkname=simplexml_load_file($file->getSubPath()。/”。$file->getFilename());
回显“-”.date('Y-m-d',filemtime($file->getPathName())。 ”;
}
}
我真正希望它首先按日期列出它们,并能够将返回的文件数限制为可配置的值。尝试:
// Create recursive dir iterator and skip the dot folders
$dir = new RecursiveDirectoryIterator(".", FilesystemIterator::SKIP_DOTS);
// Folders come before their files
$file = new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::SELF_FIRST);
// Maximum depth is 2
$file->setMaxDepth(2);
foreach(new LimitIterator(new SortedFileIterator($file, "xml"), 0, 10) as $fileinfo) {
printf("%s = %s \n", $fileinfo, date("Y-m-d g:i:s", $fileinfo->getMTime()));
// Do your stuff
}
一种简单的方法是使用SplHeap
class SortedFileIterator extends SplHeap {
public function __construct(Iterator $iterator, $ext) {
foreach($iterator as $item) {
if ($item->isFile() && $item->getExtension() == $ext) {
$this->insert($item);
}
}
}
public function compare($b, $a) {
return $a->getMTime() == $b->getMTime() ? 0 : ($a->getMTime() > $b->getMTime() ? 1 : - 1);
}
}
这个解决方案非常有趣。 SplHeap的插入不会将路径名保留为SplFileInfo的键
$iteFile = new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::SELF_FIRST);
foreach($iteFile as $pathname => $cur){
echo $pathname;
}
带排序计数器
$iteFile = new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::SELF_FIRST);
$ite = new SortedFileIterator($itefile,$ext);
foreach($ite as $cur){
$pathname=$cur->getPathname();
}
$filter=new RecursiveRegexIterator($dir,'/[a-z]+\.xml$/i');阻止它列出子目录。好的,我解决了递归问题,现在输出按上次修改的日期排序。对于第二部分,有没有一种方法可以将结果限制为X?就像前10个一样?对,但是foreach(新的LimitIterator(新的SortedIterator($file),$limit)作为$fileinfo){不再按最新的first排序。