【问题标题】:PHP (folder) File Listing in Alphabetical Order?PHP(文件夹)文件列表按字母顺序排列?
【发布时间】:2010-11-08 21:35:21
【问题描述】:

我不确定这有多简单,但我正在使用一个脚本来显示特定文件夹中的文件,但是我希望它们按字母顺序显示,这样做会很难吗?这是我正在使用的代码:

if ($handle = opendir($mainframe->getCfg( 'absolute_path' ) ."/images/store/")) {
        while (false !== ($file = readdir($handle))) {
            if ($file != "." && $file != "..")  {
                if (($file != "index.html")&&($file != "index.php")&&($file != "Thumbs.db")) {
                $strExt = end(explode(".", $file));
                    if ($strExt == 'jpg') {
                        $Link = 'index.php?option=com_shop&task=deleteFile&file[]='.$file;
                        $thelist .= '<tr class="row0"><td nowrap="nowrap"><a href="'.$Link.'">'.$file.'</a></td>'."\n";
                        $thelist .= '<td align="center" class="order"><a href="'.$Link.'" title="delete"><img src="/administrator/images/publish_x.png" width="16" height="16" alt="delete"></a></td></tr>'."\n";
                    }

                }
            }
        }
        closedir($handle); 
    }   
    echo $thelist;

:)

【问题讨论】:

    标签: php file directory alphabetized


    【解决方案1】:

    您可以简单地使用scandir (documentation) 而不是使用readdir,它默认按字母顺序排序。

    scandir 的返回值是一个数组而不是字符串,因此您的代码必须稍作调整,以迭代数组而不是检查最终的 null 返回值。此外,scandir 将带有目录路径而不是文件句柄的字符串作为输入,新版本看起来像这样:

    foreach(scandir($mainframe->getCfg( 'absolute_path' ) ."/images/store/") as $file) {
      // rest of the loop could remain unchanged
    }
    

    【讨论】:

    • 在尝试解决相同的问题时找到了这个答案。谢谢!运行良好,代码更少!
    • 这很好用。在阅读了文档之后,我什至可以使用SCANDIR_SORT_DESCENDING 作为scandir(...) 的第二个参数来反转排序顺序。提供的链接中还记录了其他几个排序常量。
    【解决方案2】:

    这段代码看起来很乱。您可以将目录遍历逻辑与演示文稿分开。一个更简洁的版本(在我看来):

    <?php
    
    // Head of page
    $it = new DirectoryIterator($mainframe->getCfg('absolute_path') . '/images/store/'));
    
    foreach ($it as $file) {
        if (preg_match('#\.jpe?g$#', $file->getFilename()))
            $files[] = $file->getFilename();
    }
    sort($files);
    
    // Further down
    foreach ($files as $file)
        // display links to delete file.
    ?>
    

    您甚至无需担心打开或关闭句柄,而且由于您使用正则表达式检查文件名,因此您不需要任何分解或条件检查。

    【讨论】:

      【解决方案3】:

      我喜欢Glob 它使目录读取变得轻而易举,因为它返回了一个易于排序的数组:

      <?php
      $files = glob("*.txt");
      sort($files);
      foreach ($files as $filename) {
          echo "$filename size " . filesize($filename) . "\n";
      }
      ?>
      

      【讨论】:

        【解决方案4】:

        如果您使用的是 Joomla1.5,您应该使用定义的常量 JPATH_BASE 而不是

        $mainframe->getCfg( 'absolute_path' )
        

        如果这是您将分发的 Joomla 扩展,请不要使用 scandir(),因为它仅适用于 PHP5。

        最好的办法是使用 Joomla API。它有一个用于目录和文件访问的类,这些类通过不同的网络和协议进行分层。例如,文件系统可以通过 FTP,并且可以为任何网络/协议扩展类。

        jimport( 'joomla.filesystem.folder' );
        $files = JFolder::files(JPATH_BASE."/images/store/");
        sort($files); 
        foreach($files as $file) { 
           // do your filtering and other task
        }
        

        您还可以将正则表达式作为第二个参数传递给 JFolder::files() 以过滤您收到的文件。

        您也不想使用像 /administrator/ 这样的 URL 文字,因为它们可以更改。 使用 JURI 方法,例如:

        JURI::base();

        如果您想确定表格中的 Joomla CSS 类,对于:

        '<tr class="row0">'
        

        使用:

        '<tr class="row'.($i&1).'">'
        

        其中 $i 是迭代次数。这为您提供了一系列交替的 0 和 1。

        【讨论】:

          【解决方案5】:

          如果我们有 PHP 内置函数,请始终使用它,它们会更快。 如果适合您的需要,请使用 glob 而不是遍历文件夹。

          $folder_names = 数组(); $folder_names = glob('*', GLOB_ONLYDIR + GLOB_MARK + GLOB_NOSORT);

          • 返回当前目录中的所有内容,在调用之前使用 chdir() 删除 GLOB_ONLYDIR 以包含文件( . 将只是文件) GLOB_MARK 用于在文件夹名称中添加斜杠 删除 GLOB_NOSORT 不对数组进行排序

          【讨论】:

          • 并非总是如此。如果您有标准化的 API,请使用它。在这种特殊情况下,代码是为 Joomla CMS 编写的。因此它应该使用 Joomla API。在 Web 开发中,速度很少是一个问题。好的设计是。
          猜你喜欢
          • 2014-08-15
          • 1970-01-01
          • 1970-01-01
          • 2015-09-12
          • 1970-01-01
          • 2015-02-02
          • 2020-03-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多