В настоящее время у меня есть файл 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); }
Вам нужно поместить файлы в массив, чтобы отсортировать и найти последний измененный файл.
$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 в массив, а затем отсортировать этот массив по файлу 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
вместо 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 .
Пример, который использует класс 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('Ymd 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); }