Сортировка файлов с помощью filemtime() и usort() дает случайные результаты


Я использую 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
Author: Alex, 2014-04-11

2 answers

Мужчина usort говорит http://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 ), что оператор "Больше", он же >, возвращает только значение true или false, но не отрицательное/нулевое/положительное число, как было запрошено.

$a > $b Больше, чем ИСТИНА, если $a строго больше, чем $b.

Что вы думаете об использовании оператора "Вычитание" "-" между двумя filemtime, потому что Человек снова говорит, что filemtime является целым числом (http://www.php.net/manual/en/function .filemtime.php).

И где-то на этом сайте есть дублирующий ответ (погуглил с время использования файла и чувствую себя счастливым - первый результат): Упорядочить этот массив по дате изменения? и ответ был дан Майклом Берковски, который говорит:

  if (filemtime($a) === filemtime($b)) return 0;
  return filemtime($a) < filemtime($b) ? -1 : 1; 
 3
Author: osgx, 2017-05-23 11:57:38

Я понял, в чем дело, и, как и ожидалось, это не имело никакого отношения к usort. Функция, используемая для получения файлов, получала только имена файлов, а не абсолютный путь к ним. Итак, filemtime вызывался бессмысленной строкой. Я понятия не имею, почему php не предупреждал об этом.

 0
Author: Alex, 2014-04-14 08:53:18