Php 排序功能scandir函数错误

Php 排序功能scandir函数错误,php,sorting,scandir,Php,Sorting,Scandir,我在使用scandir函数时遇到一些意外行为。文档中说,它是按照默认的升序对文件和文件夹进行排序。现在我有一个文件夹,其中包含六个文件: __Abstract.coffee __Abstract.js Copy.coffee Copy.js Delete.coffee Delete.js 现在看来,PHP的scandir输出在大多数情况下都是: array ( 0 => '.', 1 => '..', 2 => '__Abstract.coffee', 3 =

我在使用scandir函数时遇到一些意外行为。文档中说,它是按照默认的升序对文件和文件夹进行排序。现在我有一个文件夹,其中包含六个文件:

__Abstract.coffee
__Abstract.js
Copy.coffee
Copy.js
Delete.coffee
Delete.js
现在看来,PHP的scandir输出在大多数情况下都是:

array (
  0 => '.',
  1 => '..',
  2 => '__Abstract.coffee',
  3 => '__Abstract.js',
  4 => 'Copy.coffee',
  5 => 'Copy.js',
  6 => 'Delete.coffee',
  7 => 'Delete.js',
)
但有时大约50次中有1次它会将_Abstract.coffee和_Abstract.js放在末尾,因此返回值为:

array (
  0 => '.',
  1 => '..',
  2 => 'Copy.coffee',
  3 => 'Copy.js',
  4 => 'Delete.coffee',
  5 => 'Delete.js',
  6 => '__Abstract.coffee',
  7 => '__Abstract.js',
)
正因为如此,JS文件有时没有按正确的顺序加载—这是一个JS打包程序/迷你程序脚本

我知道如何使用排序函数来解决这个问题,但如果scandir函数自己对文件进行排序,则效率不高。这是scandir函数中的一个错误,我应该在php bugtracker中报告吗?还是更像是文件系统/操作系统的问题?我正在CENTOS 6.3下使用默认的LVM安装

你们能帮我提些建议吗:-谢谢


我在PHP上发送了一个错误报告:

看起来这与intl扩展有关。当我禁用它时,问题不会发生。如果扩展是用pecl安装的,或者是用-enable-intl编译的,这没有什么区别。我将与intl扩展的开发人员联系,以解决这个问题。

你能发布真正的scandir调用吗?您可以强制排序:@createproblem调用是$aFolderContents=scandir$sPath;。$sPath变量保存目录的路径。PHP手册声明,排序默认设置为SCANDIR\u SORT\u升序。我试图在我的代码中显式地添加它,所以它变成$aFolderContents=scandir$sPath,scandir\u SORT\u升序;但问题依然存在。我发现问题可能在于SORT\u LOCALE\u STRING排序。我添加了sort$aFolderContents,sort\u LOCALE\u STRING;这也会随机地对数组进行排序。普通字符串比较将下划线放在字母表之后。在我的例子NL_NL中,排序方法似乎并不总是能够识别设置了哪个语言环境。我在Ubuntu和RedHat之间的排序方面遇到了类似的问题,我的解决方案是设置显式的排序参数。你能测试一下下面的代码片段吗:也许这可以解决你的问题。对于性能问题,您可以缓存数据,这不是最好的,但讨厌的家伙,排序法也能解决我的问题。要记住这么多常数:D