programing

PHP에서 날짜별로 파일 정렬

copyandpastes 2021. 1. 16. 10:58
반응형

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

마지막으로 수정 된 파일을 정렬하고 찾으려면 파일을 배열에 넣어야합니다.

$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대신 함수 이름을 전달할 수 있습니다 .

결과 배열을 사용하여 다음과 같이 파일을 반복합니다.

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파일을 정렬 할 때 이미 호출했기 때문에 stat cache 로 인해 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];
});

I use your exact proposed code with only some few additional lines. The idea is more or less the same of the one proposed by @elias, but in this solution there cannot be conflicts on the keys since each file in the directory has a different filename and so adding it to the key solves the conflicts. The first part of the key is the datetime string formatted in a manner such that I can lexicographically compare two of them.

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

$files = array_diff(scandir($dir,SCANDIR_SORT_DESCENDING), array('..', '.'));
print_r($files);

ReferenceURL : https://stackoverflow.com/questions/2667065/sort-files-by-date-in-php

반응형