Список и сортировка файлов с помощью PHP DirectoryIterator


Я использую DirectoryIterator для создания связанного списка PDF-файлов. (Также есть некоторый код для разделения имени файла, чтобы сделать список более удобным для пользователя.) Я хотел бы отсортировать результаты по имени файла, но не могу понять, как это сделать. Я знаю, что мне нужно поместить результаты в массив, а затем отсортировать массив. Но я нигде не могу найти пример, который бы делал это так, как я, поэтому я не могу понять, как интегрировать массив/сортировку в свой код, так как мой PHP слаб. Может ли кто-нибудь одолжить помочь?

(путь $ объявлен в другом месте страницы)

<?php
        if (is_dir($path))
          {
            print '<ul>';
            foreach (new DirectoryIterator($path) as $file)
              {
                if ($file->isDot()) continue;
                $fileName = $file->getFilename();
                $pieces = explode('.', $fileName);
                $date = explode('-', $pieces[2]);
                $filetypes = array(
                    "pdf",
                    "PDF"
                );
                $filetype = pathinfo($file, PATHINFO_EXTENSION);
                if (in_array(strtolower($filetype), $filetypes))
                  {
                    print '<li><a href="' . $path . '' . $fileName . '">' . $pieces[2] . '</a></li>';
                  }
              }
             print '</ul>';
          }
        else
          {
            print $namePreferred . ' are not ready.</p>';
          }

        ?>
Author: Nathan, 2013-08-20

1 answers

Размещение ваших допустимых файлов в массив с различными столбцами, по которым вы можете сортировать, вероятно, лучший выбор, и при этом ассоциированный.

Я использовал asort() " Сортируйте массив и поддерживайте ассоциацию индексов"с, я думаю, наилучшим образом соответствует вашим требованиям.

if (is_dir($path)) {

    $FoundFiles = array();

    foreach (new DirectoryIterator($path) as $file) {

       if ($file->isDot()) 
          continue;

       $fileName = $file->getFilename();

       $pieces = explode('.', $fileName);
       $date = explode('-', $pieces[2]);

       $filetypes = array(
                    "pdf",
                    "PDF"
                );

       $filetype = pathinfo($file, PATHINFO_EXTENSION);
       if ( in_array( strtolower( $filetype ), $filetypes )) {

          /** 
           *  Place into an Array
          **/
          $FoundFiles[] = array( 
                        "fileName" => $fileName,
                        "date"     => $date
                     );       
       }
    }
 }

Перед сортировкой

print_r( $FoundFiles );

Array
(
   [0] => Array
       (
            [fileName] => readme.pdf
            [date] => 22/01/23
       )

   [1] => Array
       (
            [fileName] => zibra.pdf
            [date] => 22/01/53
       )

    [2] => Array
       (
            [fileName] => animate.pdf
            [date] => 22/01/53
       ) 
)

После сортировки asort()

/** 
 *   Sort the Array by FileName (The first key)
 *   We'll be using asort()
**/ 
asort( $FoundFiles );

/** 
 *   After Sorting 
**/ 
print_r( $FoundFiles );

Array
(
    [2] => Array
        (
            [fileName] => animate.pdf
            [date] => 22/01/53
        )

    [0] => Array
        (
            [fileName] => readme.pdf
            [date] => 22/01/23
        )

    [1] => Array
        (
            [fileName] => zibra.pdf
            [date] => 22/01/53
        )
 )

}

Затем для печати с помощью HTML после завершения функции - Ваш код сделал это, пока код находился в цикле, это означало, что вы не могли отсортировать его после того, как он уже был напечатан:

<ul>
   <?php foreach( $FoundFiles as $File ): ?>
      <li>File: <?php echo $File["fileName"] ?> - Date Uploaded: <?php echo $File["date"]; ?></li>
   <?php endforeach; ?>
</ul>
 8
Author: MackieeE, 2014-03-20 09:04:43