AFAICS никто еще не разместил соответствующую часть документации :
Значения параметров по умолчанию оцениваются при выполнении определения функции. Это означает, что выражение оценивается один раз, когда функция определена, и что для каждого вызова используется одно и то же «предварительно вычисленное» значение. Это особенно важно для понимания, когда параметр по умолчанию является изменяемым объектом, таким как список или словарь: если функция изменяет объект (например, добавив элемент в список), значение по умолчанию изменяется. Обычно это не то, что было предназначено. Способ вокруг этого - использовать None как значение по умолчанию и явно проверить его в теле функции [...]
Если вам нужно отсортировать, построить массив и отсортировать его.
$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>';
}