glob () - сортировка по дате - PullRequest
       34

glob () - сортировка по дате

46 голосов
/ 24 сентября 2008

Я пытаюсь отобразить массив файлов в порядке даты (последнее изменение).

Я сделал эту покупку, просматривая массив и сортируя его в другой массив, но есть ли более простой (более эффективный) способ сделать это?

Ответы [ 4 ]

90 голосов
/ 24 сентября 2008

Ради потомков, если сообщение на форуме, содержащее ссылку на принятый ответ, утрачено или неясно для некоторых, соответствующий код:

<?php

$myarray = glob("*.*");
usort($myarray, create_function('$a,$b', 'return filemtime($a) - filemtime($b);'));

?>

Протестировал это на моей системе и подтвердил, что он сортирует файлы по времени mtime. Я также использовал аналогичный подход (написанный на Python) для определения последних обновленных файлов на моем веб-сайте.

36 голосов
/ 21 июля 2010
<?php
$items = glob('*', GLOB_NOSORT);
array_multisort(array_map('filemtime', $items), SORT_NUMERIC, SORT_DESC, $items);
13 голосов
/ 10 марта 2016

Это решение аналогично принятому ответу , дополнено анонимной функцией 1 :

$myarray = glob("*.*");

usort( $myarray, function( $a, $b ) { return filemtime($a) - filemtime($b); } );

1 Анонимные функции были введены в PHP в 2010 году. Оригинальный ответ датирован 2008 годом.

0 голосов
/ 30 января 2019

Я знаю, что эта ветка старая, но это можно сделать с лучшей производительностью. usort() в принятом ответе будет вызывать filemtime() много раз. PHP использует алгоритм быстрой сортировки, который имеет среднюю производительность 1.39*n*lg(n). Алгоритм вызывает filemtime() дважды за сравнение, поэтому у нас будет около 28 вызовов для 10 записей каталога, 556 вызовов для 100 записей, 8340 вызовов для 1000 записей и т. Д. Следующий фрагмент кода хорошо работает для меня и имеет отличную производительность:

exec ( stripos ( PHP_OS, 'WIN' ) === 0 ? 'dir /B /O-D *.*' : 'ls -td1 *.*' , $myarray );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...