2014-04-11 57 views
4

我使用usort()filemtime()按修改日期对文件进行排序,但它会按错误顺序随机返回文件。我想我错过了一些非常简单的东西,但我无法弄清楚什么。使用filemtime()和usort()对文件排序会给出随机结果

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 
+1

您的代码从pastebin中消失。 –

回答

0

我想通了什么错误,正如预期的那样,它与usort无关。用来获取文件的函数只获取文件名,而不是它们的绝对路径。所以filemtime被称为无意义的字符串。我不知道为什么PHP没有提出任何警告。

+0

300赏金为一个简单的用户错误:)但没有警告,因为“2.txt”是一个有效的路径。它只是无法找到该文件,因此在失败时返回FALSE。 此外,显然你只有文件名。正如你的测试'foreach'使用与usort函数相同的数据。 –

3

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。

你认为怎么样利用两个filemtime S之间的“减法”“-”运营商,因为人再次表示,filemtime是整数(http://www.php.net/manual/en/function.filemtime.php)。

而且有重复的答案的地方在这个网站(Google搜索与filemtime usort感觉幸运 - 第一个结果是):Order this array by date modified?和答案是由Michael Berkowski,谁说:

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

谢谢!但那并不奏效。奇怪的是,现在看起来订单总是在第6个文件上传时被加扰。我猜这个问题与'usort()'无关,但我无法弄清楚什么。我用完整的代码编辑了问题。 – Alex

+1

+1,即使这不是一个好的答案,这是一个很好的猜测,只要*某种*威胁的处理时间短于1秒即可处理多个文件。 –