Сортировка файлов PHP RecursiveDirectoryIterator

Я отлично перечисляю файлы в своем подкаталоге, используя следующий код

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

То, что я действительно хотел бы сделать, это перечислить их по дате, измененной самой новой, и иметь возможность ограничить количество файлов, возвращаемых настраиваемым значением.


person user2414455    schedule 23.05.2013    source источник


Ответы (2)


Пытаться:

// 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);
    }
}
person Baba    schedule 23.05.2013
comment
$filter = new RecursiveRegexIterator($dir, '/[az]+\.xml$/i'); однако не позволяет ему перечислять подкаталоги. - person user2414455; 23.05.2013
comment
Хорошо, я разобрался с проблемой рекурсии, и теперь выходные данные упорядочиваются по дате последнего изменения. Теперь о второй части. Был ли способ использовать это, чтобы ограничить результаты до X? Нравятся только первые 10? - person user2414455; 23.05.2013
comment
Верно, но foreach(new LimitIterator(new SortedIterator($file), $limit) as $fileinfo) { больше не упорядочивает список в порядке убывания. - person user2414455; 23.05.2013

Решение 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();
}
person Pascal KOCH    schedule 24.03.2017