使用filemtime()和usort()对文件进行排序会得到随机结果


Sorting files with filemtime() and usort() gives random results

我使用usort()filemtime()按修改日期对文件进行排序,但它会以错误的顺序随机返回文件。我想我错过了一些非常简单的东西,但我不知道是什么。

usort($user_files, function($a, $b) {
    return filemtime($a) > filemtime($b);
});
foreach ($user_files as $f) {
    echo $f . "<br />";
}

之后我上传了文件。完整的代码。

上传文件1.txt时。。。10.txt测试发生了什么,显示的结果是:

6.txt
5.txt
4.txt
3.txt
2.txt
1.txt
7.txt Uploaded!

正如预期的那样。然后,当我到达8.txt:时

6.txt
7.txt
5.txt
4.txt
2.txt
3.txt
1.txt
8.txt Uploaded!

还有一次很好,直到我到达10.txt:

7.txt
8.txt
9.txt
6.txt
5.txt
2.txt
3.txt
4.txt
1.txt
10.txt Uploaded!

ls -t返回时:

10.txt  9.txt  8.txt  7.txt  6.txt  5.txt  4.txt  3.txt  2.txt  1.txt

所以。。。那里发生了什么事?

Debian Wheezy 7.4, up-to-date.
PHP Version 5.4.4-14+deb7u8
Linux pc 3.2.0-4-amd64 #1 SMP Debian 3.2.54-2 x86_64
FPM/FastCGI
nginx/1.2.1

usort说http://www.php.net/manual/en/function.usort.php

value_compare_func

如果第一个参数被认为分别小于、等于或大于第二个参数,则比较函数必须返回小于、等于和大于零的整数。

但提供的回调只有">"运算符:

{
    return filemtime($a) > filemtime($b);
}

男人说(http://www.php.net/manual/en/language.operators.comparison.php)"大于"(即>运算符)只返回true或false,而不返回负数/零/正数。

如果$a严格大于$b,则$a > $b大于TRUE。

你认为在两个filemtime之间使用"减法"-"运算符是什么,因为Man再次说filemtime是整数(http://www.php.net/manual/en/function.filemtime.php)。

这个网站上的某个地方有重复的答案(在谷歌上搜索filemtime usort并感到幸运——第一个结果是):按修改日期排序这个数组?Michael Berkowski给出了答案,他说:

  if (filemtime($a) === filemtime($b)) return 0;
  return filemtime($a) < filemtime($b) ? -1 : 1; 

我发现了问题所在,不出所料,它与usort无关。用于获取文件的函数只获取文件名,而不是文件的绝对路径。所以filemtime是用一个无意义的字符串调用的。我不知道php为什么没有对此发出警告。