php DirectoryIterator сортирует файлы по дате - PullRequest
16 голосов
/ 04 октября 2011

Я использую класс php DirectoryIterator для вывода списка файлов в каталоге. Однако я не могу найти простой способ сортировки файлов по дате. Как это сделать с DirectoryIterator

<?php
 $dir = new DirectoryIterator('.');
  foreach ($dir as $fileinfo) {     
     echo $fileinfo->getFilename() . '<br>';
   }
?>

Что если я назову мои файлы как угодно_2342345345.ext, где числа представляют время в миллисекундах, поэтому каждый файл имеет уникальный номер. Как мы можем отсортировать, глядя на цифры после подчеркивания

Ответы [ 3 ]

23 голосов
/ 04 октября 2011

Если вам нужно отсортировать, создайте массив и сортируйте его.

$files = array();
$dir = new DirectoryIterator('.');
foreach ($dir as $fileinfo) {     
   $files[$fileinfo->getMTime()][] = $fileinfo->getFilename();
}

ksort($files);

Это создаст массив с измененным временем в качестве ключа и массив имен файлов в качестве значения. Затем он сортирует по ksort(), что даст вам имена файлов в порядке изменения времени.

Если затем вы хотите перераспределить структуру до стандартного массива, вы можете использовать ...

$files = call_user_func_array('array_merge', $files);
3 голосов
/ 16 ноября 2016

Если вы по-прежнему хотите получить доступ ко всем данным, доступным в DirectoryIterator (например, isDot() getSize() и т. Д.), Возможный способ - сохранить ключ итератора в массиве, который вы собираетесь отсортировать, и искать DirectoryIterator позже.

$sorted_keys = array();
$dir_iterator = new DirectoryIterator('.');

foreach ( $dir_iterator as $fileinfo )
{
    $sorted_keys[$fileinfo->getMTime()] = $fileinfo->key();
}

ksort($sorted_keys);

/* Iterate `DirectoryIterator` as a sorted array */
foreach ( $sorted_keys as $key ) 
{
    $dir_iterator->seek($key);
    $fileinfo = $dir_iterator->current();

    /* Use $fileinfo here as a normal DirectoryIterator */
    echo $fileinfo->getFilename() . '  ' . $fileinfo->getSize() . '<br>';
}
1 голос
/ 17 февраля 2014

Если несколько файлов имеют одинаковое время изменения (обновлено):

$files = array();
$mtimes = array();
$dir = new DirectoryIterator('.');
foreach($dir as $file){
  if(!$file->isFile())
    continue;

  $mtime = $file->getMTime();

  if(!$mtimes[$mtime]){
    $files[$mtime.'.0'] = $file->getFilename();
    $mtimes[$mtime] = 1;
  }else{
    $files[$mtime.'.'.$mtimes[$mtime]++] = $file->getFilename();
  }
}

ksort($files);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...