9

我正在使用 DirectoryIterator 生成 PDF 文件的链接列表。(还有一些代码可以分解文件名以使列表更加用户友好。)我想按文件名对结果进行排序,但不知道如何。我知道我需要将结果放入一个数组中,然后对数组进行排序。但是,我在任何地方都找不到像我这样的例子,所以我不知道如何将数组/排序集成到我的代码中,因为我的 PHP 很弱。任何人都可以提供帮助吗?

($path 在页面的其他地方声明)

<?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>';
          }

        ?>
4

2 回答 2

12

将您的有效文件放入可以排序的各种列的数组中可能是最好的选择,也是一个关联的选择。

我使用了asort()对数组进行排序并保持索引关联”,我认为最适合您的要求。

if (is_dir($path)) 
{
    $FoundFiles = [];

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

       if ($file->isDot())
       {
          continue;
       }
    
       $fileName = $file->getFilename();

       $pieces    = explode('.', $fileName);
       $date      = explode('-', $pieces[2]);
                
       $filetypes = [ "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>
于 2013-08-20T14:32:57.327 回答
3

使用scandir而不是DirectoryIterator来获取文件的排序列表:

$path = "../images/";

foreach (scandir($path) as $file){

    if($file[0] == '.'){continue;}//hidden file

    if( is_file($path.$file) ){

    }else if( is_dir($path.$file) ){

    }
}

scandir区分大小写。对于不区分大小写的排序,请参阅此答案: 如何扫描不区分大小写的目录?

于 2018-11-15T22:45:42.773 回答