Упорядочить файлы по дате создания

195
19 февраля 2019, 10:30

подскажите, как правильно заменить значение ключа на метку времени создания файла для сортировки?

$entries = array();
        if ($handle = opendir(ROOT_DIR .ARTICLE_DIR)) {
            // получаем названия статей и названия файлов 
            while (false !==($entry = readdir($handle))) {
                if ($entry !='.' and $entry != '..') {  
                    $entries[] = $entry;
                    foreach ($entries as $key => $entry){
                        заменить ключ на метку времени создания файла}
                    //usort($entries);
                    echo '<li><a href="index.php?show='.$entry.'">'.$entry.'</a></li>'.'<br>';
                }
            }
        }
Answer 1

Если вам требуется отсортировать файлы по дате создания, то можно решить задачу в пару этапов. Сначала собрать массив с датами создания, используя array_map и filectime(), затем слить оба массива и отсортировать по ключам (что в принципе вы и хотели).
Таким образом, если в $entries у вас имена файлов, то как-то так:

$ct = array_map('filectime', $entries);
$data = array_combine($ct, $entries);
ksort($data);

В целом все же это несколько корявый подход, и лучше сначала собрать массив, где элемент будет содержать информацию о времени создания и имени файла. А затем уже воспользоваться обычной сортировкой. Это исключит вариант с потенциальным повторением ключей.

$entries = array_map(function($f){ 
                   return ['f' => $f, 'ct' => filectime($f)];
               }, $entries);
usort($entries, function($a, $b){ return $a['ct'] - $b['ct']; });
$entries = array_column($entries, 'f');

Можно, конечно, и просто воспользоваться использованием filectime в функции-компараторе

usort($entries, function($a, $b){ return filectime($a) <=> filectime($b);});

Но это повлечет больше обращений к файловой системе при сортировке.

в дополнение:

В первом случае, можно сделать ключами имена файлов, поменять местами аргументы array_combine, а затем использовав обычную сортировку sort() и вернув ключи array_keys() с именами. Пожалуй, это будет оптимальным вариантом.

$ct = array_map('filectime', $entries);
$data = array_combine($entries, $ct);
sort($data)
$files = array_keys($data);

Еще более оптимальный вариант будет таким

array_multisort(array_map('filectime', $entries), SORT_DESC, $entries);
READ ALSO
Не могу запустить OpenServer [закрыт]

Не могу запустить OpenServer [закрыт]

OpenServer не запускается, пару минут назад работал, а сейчас нетВот лог Файл C:\Windows\system32\drivers\etc\hosts недоступен для записи

180
Проблемы с заголовком диалогового окна

Проблемы с заголовком диалогового окна

столкнулся с такой проблемой как изменение заголовка диалогового окна, в зависимости от получения результата с хостинга

152
C++ проблемы getch putch

C++ проблемы getch putch

Я хочу организовать ввод пароля, чтобы вместо символа в консоли появлялись звездочка, если нажата клавиша Enter ввод заканчиваетсяВместо одной...

223
OpenGL не видит функции библиотек glew и glfw

OpenGL не видит функции библиотек glew и glfw

Начал изучать OpenGL по курсу "Gameinstitute - OpenGL Graphics Programming"В третьем видио на восемнадцатой минуте происходит сборка сцены, а у меня повыпрыгивали...

207