【问题标题】:PHP readdir() not returning files in alphabetical orderPHP readdir()不按字母顺序返回文件
【发布时间】:2010-10-07 04:35:09
【问题描述】:

我正在阅读一个包含一些图片的目录,使用 readdir() 的一个非常简单的实现,如下所示:

if ($handle = opendir($path)) {
    while (false !== ($szFilename = readdir($handle))) {
    if ($szFilename[0] !== '.') {
        if (is_file($path.$szFilename)) {
                // do stuff
            }
        }
     }
 }

我遇到的问题是文件没有按字母顺序读取,因为 readdir() 状态的文档:

返回下一个文件的文件名 从目录。文件名是 按他们的顺序返回 由文件系统存储。

另一个奇怪的事情是,在本地测试服务器上,相同的代码运行良好。在这两种情况下,它都在使用 LAMP 堆栈的服务器上运行。

我知道我可以构建一个数组并对其进行排序,但我想知道我在做的事情是否遗漏了什么。

【问题讨论】:

    标签: php


    【解决方案1】:

    有几个你可以使用:

    字母排序:

    <?php
    sort($handle);
    ?>
    

    反向字母排序:

    <?php
    rsort($handle);
    ?>
    

    【讨论】:

    • OP 中的 $handleresourcesortrsort 都不接受。需要将整个数组拉入内存,然后调用sort()rsort()。如果有人愿意这样做,不妨在所有现代 PHP 实现中使用scandir
    【解决方案2】:

    您可以将所有文件名复制到一个数组中,然后使用

    <?php
    sort($filesArray);
    ?>
    

    【讨论】:

      【解决方案3】:

      字母顺序 :: 我想你误读了你引用的 sn-p...

      返回目录中下一个文件的文件名。文件名按照文件系统存储的顺序返回。

      'ls' 会以(通常)字母顺序显示文件这一事实并不意味着它们在文件系统上的存储方式就是这样。恐怕 PHP 的行为符合规范。

      如果必须按字母排序,您可能需要考虑使用scandir 作为您努力的基础。 :)

      【讨论】:

      • 顺便说一句:ls -U 按目录条目存储在目录中的顺序列出文件。
      • glob() 函数在这里也可以提供帮助。 php.net/glob 默认情况下,它返回按字母排序的文件。
      【解决方案4】:

      您误读了文档:

      文件名按照文件系统存储的顺序返回。

      表示文件按照创建顺序返回。

      【讨论】:

      • nitpick:probably 表示它们的创建顺序 =) 我想,可以创建一个以其他顺序返回文件的文件系统。
      【解决方案5】:

      我想这里的文档很清楚。

      它们在文件系统中的存储顺序

      字母顺序不一样

      【讨论】:

      • 也许他将图像按字母顺序存储在您的测试服务器上,从而使存储顺序等于字母顺序
      • 不保证按字母顺序排列。这就是文档所说的。
      • 文档并没有说不能保证顺序是字母顺序。我不会说他们“非常清楚”文件系统顺序与字母顺序不同。文档对字母表只字未提。他们可以更清楚地了解差异。
      • 好的,让我重述一下。文档并没有说保证顺序是字母顺序,实际上引用并没有说明字母顺序。这就像白天一样清晰。
      • 在一个主题上心照不宣永远不会让事情变得“像白天一样清晰”。文档可能会说,“文件系统顺序不一定与通常预期的顺序相同,例如字母顺序或创建时间顺序。”那会很清楚。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 2013-05-12
      • 2010-12-08
      • 2016-08-02
      • 1970-01-01
      相关资源
      最近更新 更多