http://php.net/manual/en/class.filesystemiterator.php
Я заметил, что FilesystemIterator
возвращает файлы, упорядоченные по имени. Кто-нибудь может подтвердить, что это правда, и это всегда происходит? Я не нашел ничего в документах.
Другой вопрос, есть ли способ получить файлы, упорядоченные по времени создания на диске? getCTime()
кажется, возвращает время изменения, поэтому я не могу использовать его с usort()
Я немного покопался во внутренностях PHP.
Если я не ошибаюсь, метод __construct FileSystemIterator заканчивается использованием VCWD_OPENDIR
C
макрос: https://github.com/php/php-src/blob/2f443acad19816e29b0c944426238d9f23af1ae2/main/streams/plain_wrapper.c#L908
Это макрос для C
функция opendir()
,
Просматривая документацию по этой функции, я не вижу ничего, что позволило бы определить порядок любого типа: http://pubs.opengroup.org/onlinepubs/009695399/functions/opendir.html
Зная это, я бы предположил, что порядок не является обязательным и может варьироваться в зависимости от типа используемой файловой системы (fat32, ntfs и т. Д.).
Поэтому, если бы вы были на моем месте, я бы реализовал функцию PHP, которая бы упорядочивала их так, как я хочу.
По второму вопросу проверьте: PHP: как я могу получить дату создания файла?
Вы должны отсортировать их вне FilesystemIterator, поскольку он только повторяется.
Вот пример:
$files = array();
$dir = new DirectoryIterator('.');
foreach ($dir as $fileinfo) {
$files[$fileinfo->getMTime()][] = $fileinfo->getFilename();
}
ksort($files);
Я заметил, что FilesystemIterator возвращает файлы, упорядоченные по имени. Кто-нибудь может подтвердить, что это правда, и это всегда происходит? Я не нашел ничего в документах.
Вы не можете сортировать данные, полученные из итератора. Зачем? Поскольку Итератор ленив в обработке данных, это означает, что итератор знает только об 1 элементе за один раз.
Таким образом, итератор не сортирует файлы каким-либо образом, и вы не можете сортировать данные напрямую из итератора, вам нужно сохранить их в массив или около того, чтобы иметь возможность сортировать данные.
Другой вопрос, есть ли способ получить файлы, упорядоченные по времени создания на диске?
usort()
это хорошая идея, но не с DirectoryIterator::getCTime()
, потому что это метод итератора. Но вы можете использовать: filemtime()
(Просто знайте, что функция кэшируется!)
На самом деле порядок может быть случайным. Итак, вы должны сортировать произвольно. Для сортировки по алфавиту используйте эту простую конструкцию:
$files = iterator_to_array(new RecursiveDirectoryIterator('.', FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS), true);
ksort($files);
Установите флаги по мере необходимости.