4

usort()andを使用し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

usortは言うhttp://www.php.net/manual/en/function.usort.php

value_compare_func

比較関数は、最初の引数がそれぞれ 2 番目の引数より小さい、等しい、または大きいと見なされる場合、0 より小さい、等しい、または大きい整数を返さなければなりません。

しかし、提供されたコールバックには " >" 演算子しかありません:

{
    return filemtime($a) > filemtime($b);
}

男は、( http://www.php.net/manual/en/language.operators.comparison.php )、「より大きい」別名>演算子は真または偽のみを返し、負/ゼロ/正の数は返さないと言っています。要求どおり。

$a > $b$a が厳密に $b より大きい場合、TRUE より大きい。

2 つの s の間で「減算-」演算子を使用することについて考えること " "filemtimefilemtime

そして、このサイトのどこかに重複した回答があります(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 に答える