Php DirectoryIterator сортирует файлы по дате

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

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

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

Ответы

Ответ 1

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

$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);

Ответ 2

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

$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);

Ответ 3

Если вы все еще хотите получить доступ ко всем данным, доступным в DirectoryIterator (например, isDot() getSize() и т.д.), возможно, это сохранить ключ Iterator в массиве, который вы собираетесь сортировать, и искать 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>';
}