сортировать файлы по дате в PHP - PullRequest
53 голосов
/ 19 апреля 2010

У меня в настоящее время есть файл 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 ]

155 голосов
/ 19 апреля 2010

Это приведет к тому, что все файлы в пути / к / файлам с расширением .swf будут помещены в массив, а затем отсортированы в этом массиве по mtime

файла.
$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 дополнительных затрат не возникает из-за stat cache .

21 голосов
/ 19 апреля 2010

Вам нужно поместить файлы в массив, чтобы отсортировать и найти последний измененный файл.

$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>";
        }
    }
}

Не проверено, но вот как это сделать.

10 голосов
/ 02 апреля 2015

Пример, использующий класс 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];
});
0 голосов
/ 06 февраля 2018
$files = array_diff(scandir($dir,SCANDIR_SORT_DESCENDING), array('..', '.'));
print_r($files);
0 голосов
/ 16 марта 2016

Я использую ваш точный предложенный код только с несколькими дополнительными строками. Идея более или менее аналогична предложенной @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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...