PHP readdir() не возвращает файлы в алфавитном порядке
Я читаю через каталог с некоторыми изображениями и, например, используя довольно простую реализацию readdir(), как показано ниже:
if ($handle = opendir($path)) {
while (false !== ($szFilename = readdir($handle))) {
if ($szFilename[0] !== '.') {
if (is_file($path.$szFilename)) {
// do stuff
}
}
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что файлы не читаются в алфавитном порядке, поскольку документы для readdir():
Возвращает имя файла следующего файла из каталога. Имена файлов возвращаются в том порядке, в котором они сохраняются файловой системой.
Еще одна странность в том, что на локальном сервере тестирования тот же код отлично работает. Это выполняется на сервере с использованием стека LAMP в обоих случаях.
Я знаю, что могу построить массив и просто отсортировать его, но мне было интересно, не хватает ли чего-то в том, что я делаю.
Ответы
Ответ 1
Алфавитный порядок:: Я думаю, вы неправильно читаете фрагмент, который вы указали...
Возвращает имя файла следующего файла из каталога. Имена файлов возвращаются в том порядке, в котором они хранятся в файловой системе.
Тот факт, что 'ls' будет отображать файлы в (обычно) в алфавитном порядке, не означает, что они хранятся в файловой системе. Я боюсь, PHP ведет себя как спецификация.
Возможно, вы захотите использовать scandir в качестве основы для своих усилий, если алфавитная сортировка является обязательной.:)
Ответ 2
Вы можете скопировать все имена файлов в массив, а затем использовать
<?php
sort($filesArray);
?>
Ответ 3
Я полагаю, что документы здесь совершенно ясны.
порядок, в котором они хранятся в файловой системе
не совпадает с алфавитным порядком
Ответ 4
Вы неправильно читаете документы:
Имена файлов возвращаются в том порядке, в котором они хранятся в файловой системе.
означает, что файлы возвращаются в том порядке, в котором они были созданы.
Ответ 5
Есть пара, которую вы можете использовать:
По алфавиту Сортировать:
<?php
sort($handle);
?>
Обратный алфавитный Сортировать:
<?php
rsort($handle);
?>