#php #arrays #sorting
#php #массивы #сортировка
Вопрос:
Я читаю все каталоги и файлы внутри каталога и хочу отсортировать файлы по алфавиту.
if ($handle = opendir($dir)) {
while (false !== ($file = readdir($handle))) {
$files = array($file);
sort($files);
$clength = count($files);
for($x = 0; $x < $clength; $x ) {
echo $files[$x];
echo "<br>";
}
Приведенный выше код выводит мне все каталоги и файлы, но не сортирует их по алфавиту. Что я делаю не так?
Ответ №1:
Чтобы ответить на ваш вопрос, вам нужно сначала собрать все файлы, а затем отсортировать их сразу. Итак, ваш код будет выглядеть так-
<?php
while (false !== ($file = readdir($handle))) {
$files[] = $file;
}
sort($files);
- Но лучший вариант — просто использовать scandir(), который возвращает вам список файлов (включая папки) в вашем каталоге, а затем вы можете отсортировать их соответствующим образом.
- Я использовал usort(), который сортирует файлы в алфавитном порядке, игнорируя верхний или нижний регистр, сохраняя при этом исходное представление имени файла.
Код:
<?php
$files = array_diff(scandir(YOUR_DIRECTORY_PATH_HERE),array(".",".."));
usort($files,function($file1,$file2){
return strcmp(strtolower($file1),strtolower($file2));
});
print_r($files);
- Я использовал array_diff() для удаления
.
и..
, который включен в результатscandir().
Комментарии:
1. Раньше я сортировал их с
scandir
помощью first, но я отображаю много файлов. Я сравнилopendir/readdir
сscandir
и первый намного быстрее, когда дело доходит до рендеринга большого количества файлов. Вот почему я решилscandir
больше не использовать2. @mudrayakatusha Оба должны быть более или менее одинаковыми по производительности, потому что оба должны читать все файлы в каталоге. Кроме того, что вы имеете в виду
render a lot of files
? Это то, что вы создаете, своего рода файловый менеджер для какого-то приложения?3. ДА. Я это для файловой системы. Возможно, вы правы в отношении производительности обоих, но я изменил использование
opendir/readdir
на основе этого: infinitemonkey.xyz/software-development/…4. @mudrayakatusha хорошо, я не тестировал это, поэтому сейчас ничего не могу сказать. Также обновил мой код,
array_diff
поскольку это лучший вариант, чемarray_slice
.
Ответ №2:
Вы должны использовать этот.
if ($handle = opendir($dir)) {
while (false !== ($file = readdir($handle))) {
$files[] = $file;
}
sort($files);
$clength = count($files);
for ($x = 0; $x < $clength; $x ) {
echo $files[$x];
echo "<br>";
}
}
Обновить
$files[] = strtolower($file); // for ignore first letter capital
Комментарии:
1. Я так рад счастливому кодированию 🙂
2. Почему
sort()
на каждой итерации?