我使用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为什么没有对此发出警告。