Сортировать файлы по дате в PHP
В настоящее время у меня есть файл index.php, который позволяет мне выводить список файлов внутри одного и того же каталога, на выходе отображаются имена, а затем я использовал функцию filemtime(), чтобы показать дату, когда файл был изменен. моя проблема заключается в том, как я буду сортировать вывод, чтобы показать последний измененный файл? Я долго думал о том, как это сделать. если только я делаю это с взаимодействием mysql, проблем не будет. пожалуйста, покажите мне пример, как сортировать и выводить список файлов, начиная с последнего измененного. это то, что я на данный момент
if ($handle = opendir('.')) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$lastModified = date('F d Y, H:i:s',filemtime($file));
if(strlen($file)-strpos($file,".swf")== 4){
echo "<tr><td><input type=\"checkbox\" name=\"box[]\"></td><td><a href=\"$file\" target=\"_blank\">$file</a></td><td>$lastModified</td></tr>";
}
}
}
closedir($handle);
}
Ответы
Ответ 1
Вам нужно поместить файлы в массив, чтобы сортировать и находить последний измененный файл.
$files = array();
if ($handle = opendir('.')) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$files[filemtime($file)] = $file;
}
}
closedir($handle);
// sort
ksort($files);
// find the last modification
$reallyLastModified = end($files);
foreach($files as $file) {
$lastModified = date('F d Y, H:i:s',filemtime($file));
if(strlen($file)-strpos($file,".swf")== 4){
if ($file == $reallyLastModified) {
// do stuff for the real last modified file
}
echo "<tr><td><input type=\"checkbox\" name=\"box[]\"></td><td><a href=\"$file\" target=\"_blank\">$file</a></td><td>$lastModified</td></tr>";
}
}
}
Не проверено, но как это сделать.
Ответ 2
Это позволит получить все файлы в пути/в/файлы с расширением .swf в массив, а затем отсортировать этот массив по файлу mtime
$files = glob('path/to/files/*.swf');
usort($files, function($a, $b) {
return filemtime($a) < filemtime($b);
});
Вышеупомянутая функция Lambda требует PHP 5.3. До 5.3 вы бы сделали
usort($files, create_function('$a,$b', 'return filemtime($a)<filemtime($b);'));
Если вы не хотите использовать анонимную функцию, вы можете точно определить обратный вызов как регулярную функцию и передать имя функции usort
вместо этого.
С результирующим массивом вы затем будете перебирать файлы следующим образом:
foreach($files as $file){
printf('<tr><td><input type="checkbox" name="box[]"></td>
<td><a href="%1$s" target="_blank">%1$s</a></td>
<td>%2$s</td></tr>',
$file, // or basename($file) for just the filename w\out path
date('F d Y, H:i:s', filemtime($file)));
}
Обратите внимание, что поскольку вы уже вызывали filemtime
при сортировке файлов, нет дополнительных затрат при повторном вызове в цикле foreach из-за к кешу stat.
Ответ 3
Пример, который использует класс RecursiveDirectoryIterator, это удобный способ рекурсивно перебирать файловую систему.
$output = array();
foreach( new RecursiveIteratorIterator(
new RecursiveDirectoryIterator( 'path', FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS ) ) as $value ) {
if ( $value->isFile() ) {
$output[] = array( $value->getMTime(), $value->getRealPath() );
}
}
usort ( $output, function( $a, $b ) {
return $a[0] > $b[0];
});
Ответ 4
Я использую ваш точный предложенный код только с несколькими дополнительными строками. Идея более или менее такая же, как предложенная @elias, но в этом решении конфликты на ключах не могут быть такими, поскольку каждый файл в каталоге имеет другое имя файла, и поэтому добавление его к ключу решает конфликты. Первая часть ключа - это строка даты и времени, отформатированная таким образом, что я могу лексикографически сравнить два из них.
if ($handle = opendir('.')) {
$result = array();
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$lastModified = date('F d Y, H:i:s',filemtime($file));
if(strlen($file)-strpos($file,".swf")== 4){
$result [date('Y-m-d H:i:s',filemtime($file)).$file] =
"<tr><td><input type=\"checkbox\" name=\"box[]\"></td><td><a href=\"$file\" target=\"_blank\">$file</a></td><td>$lastModified</td></tr>";
}
}
}
closedir($handle);
krsort($result);
echo implode('', $result);
}
Ответ 5
$files = array_diff(scandir($dir,SCANDIR_SORT_DESCENDING), array('..', '.'));
print_r($files);