Подтвердить что ты не робот

Сортировать файлы по дате в 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);
}
4b9b3361

Ответ 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);