我使用usort()
和filemtime()
按修改日期对文件进行排序,但它会以错误的顺序随机返回文件。我想我错过了一些非常简单的东西,但我无法弄清楚是什么。
usort($user_files, function($a, $b) {
return filemtime($a) > filemtime($b);
});
foreach ($user_files as $f) {
echo $f . "<br />";
}
之后我上传文件。 Complete code
上传文件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
答案 0 :(得分:3)
人usort
说http://www.php.net/manual/en/function.usort.php
value_compare_func
如果第一个参数被认为分别小于,等于或大于第二个参数,则比较函数必须返回小于,等于或大于零的整数。
但是提供的回调只有“>
”运算符:
{
return filemtime($a) > filemtime($b);
}
并且Man说(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搜索并感觉很幸运 - 第一个结果是):Order this array by date modified?,答案是Michael Berkowski,他说:< / p>
if (filemtime($a) === filemtime($b)) return 0;
return filemtime($a) < filemtime($b) ? -1 : 1;
答案 1 :(得分:0)
我弄清楚出了什么问题,正如预期的那样,它与usort
无关。用于获取文件的函数只获取文件名,而不是它们的绝对路径。所以filemtime
被称为无意义的字符串。我不知道为什么php没有提出任何警告。