복붙노트

PHP로 날짜별로 파일 정렬

PHP

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

해결법

  1. ==============================

    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. ==============================

    2.이것은 .swf 확장자를 가진 path / to / files의 모든 파일을 배열로 가져온 다음 파일의 mtime으로 배열을 정렬합니다.

    이것은 .swf 확장자를 가진 path / to / files의 모든 파일을 배열로 가져온 다음 파일의 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 캐시로 인해 foreach 루프에서 다시 호출 할 때 추가 비용이 들지 않습니다.

  3. ==============================

    3.RecursiveDirectoryIterator 클래스를 사용하는 예제는 파일 시스템을 반복적으로 반복하는 편리한 방법입니다.

    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. ==============================

    4.나는 당신의 정확한 제안 된 코드를 오직 몇 개의 추가 라인과 함께 사용한다. 이 아이디어는 @elias가 제안한 것과 거의 같지만이 솔루션에서는 디렉토리의 각 파일마다 다른 파일 이름이 있으므로 키에 충돌이 없어 충돌을 해결할 수 있습니다. 키의 첫 번째 부분은 사전 식으로 두 개를 비교할 수있는 방식으로 형식화 된 날짜 / 시간 문자열입니다.

    나는 당신의 정확한 제안 된 코드를 오직 몇 개의 추가 라인과 함께 사용한다. 이 아이디어는 @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. ==============================

    5.$ files = array_diff (scandir ($ dir, SCANDIR_SORT_DESCENDING), 배열 ( '..', '.')); print_r ($ 파일);

    $ files = array_diff (scandir ($ dir, SCANDIR_SORT_DESCENDING), 배열 ( '..', '.')); print_r ($ 파일);

  6. from https://stackoverflow.com/questions/2667065/sort-files-by-date-in-php by cc-by-sa and MIT license