сортировка файлов по дате в 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);
}
5 answers
Вам нужно поместить файлы в массив, чтобы отсортировать и найти последний измененный файл.
$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>";
}
}
}
Не проверено, но вот как это сделать.
Это позволило бы собрать все файлы в пути/к/файлам с расширением .swf в массив, а затем отсортировать этот массив по времени файла
$files = glob('path/to/files/*.swf');
usort($files, function($a, $b) {
return filemtime($a) < filemtime($b);
});
Вышеизложенное использует Лямбда-функцию и требует 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 из-за кэша статистики .
Пример, в котором используется класс 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];
});
Я использую ваш точный предложенный код всего с несколькими дополнительными строками. Идея более или менее совпадает с идеей, предложенной @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);
}
$файлы =array_diff(scandir($dir, SCANDIR_SORT_DESCENDING), массив('..', '.')); print_r($файлы);