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