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

时间:2014-04-11 02:22:51

标签: php unix-timestamp usort filemtime

我使用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

2 个答案:

答案 0 :(得分:3)

usorthttp://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没有提出任何警告。