как сортировать каталоги и файлы в определенном каталоге?

#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() на каждой итерации?