4

我正在使用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
4

2 回答 2

4

男人usorthttp://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)“大于”又名>运算符只返回真或假,而不是负数/零/正数,按照要求。

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

您对-在两个filemtimes 之间使用“减法”“”运算符的想法是什么,因为 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; 
于 2014-04-14T03:50:08.467 回答
0

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

于 2014-04-14T08:53:18.940 回答