сортировка файлов по дате в 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);
}
 46
Author: sasori, 2010-04-19

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

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

 22
Author: elias, 2015-06-08 13:38:06

Это позволило бы собрать все файлы в пути/к/файлам с расширением .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 из-за кэша статистики .

 144
Author: Gordon, 2010-04-19 15:45:10

Пример, в котором используется класс 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];
});
 8
Author: Danijel, 2015-04-02 19:32:22

Я использую ваш точный предложенный код всего с несколькими дополнительными строками. Идея более или менее совпадает с идеей, предложенной @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);
}
 0
Author: Roberto Trani, 2016-03-16 10:17:52

$файлы =array_diff(scandir($dir, SCANDIR_SORT_DESCENDING), массив('..', '.')); print_r($файлы);

 -1
Author: Wynn, 2018-02-06 16:56:26