Я использую класс PHP DirectoryIterator
для отображения файлов в каталоге. Однако я не могу найти простой способ сортировки файлов по дате. Как это делается с DirectoryIterator
<?php $dir = new DirectoryIterator('.'); foreach ($dir as $fileinfo) { echo $fileinfo->getFilename() . '<br>'; } ?>
Что делать, если я называю мои файлы как any_2342345345.ext, где числа представляют время в миллисекундах, поэтому каждый файл имеет уникальный номер. Как мы можем сортировать, глядя на цифры после подчеркивания
Если вам нужно отсортировать, построить массив и отсортировать его.
$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);
Если несколько файлов имеют одинаковое модифицированное время (обновлено):
$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);
Если вы все еще хотите получить доступ ко всем данным, доступным в 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>'; }