【问题标题】:PHP Sorting Files RecursiveDirectoryIteratorPHP 排序文件 RecursiveDirectoryIterator
【发布时间】:2013-05-23 17:43:57
【问题描述】:

我可以使用以下代码列出我的子目录中的文件

// 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>';
 }
}

我真正想做的是按最新的修改日期列出它们,并能够将返回的文件数量限制为可配置的值。

【问题讨论】:

    标签: php sorting recursion spl


    【解决方案1】:

    试试:

    // 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);
        }
    }
    

    【讨论】:

    • $filter = new RecursiveRegexIterator($dir, '/[a-z]+\.xml$/i');阻止它列出子目录。
    • 好的,我解决了递归问题,输出现在按上次修改日期排序。现在对于第二部分,有没有办法使用它来将结果限制为 X?就像前 10 个一样?
    • 对,但是,foreach(new LimitIterator(new SortedIterator($file), $limit) as $fileinfo) { 不再按最新的优先排序。
    【解决方案2】:

    SortedFileIterator 的解决方案非常有趣。 SplHeap 的插入不保留路径名作为 SplFileInfo 的键。

    $iteFile = new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::SELF_FIRST);
    foreach($iteFile as $pathname => $cur){
        echo $pathname;
    }
    

    使用 SortedFileIterator

    $iteFile = new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::SELF_FIRST);
    $ite = new SortedFileIterator($itefile,$ext);
    foreach($ite as $cur){
        $pathname=$cur->getPathname();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-06
      • 2011-02-25
      • 1970-01-01
      • 2014-05-12
      • 1970-01-01
      • 2013-07-26
      • 2011-12-04
      • 1970-01-01
      相关资源
      最近更新 更多