programing

PHP에서 날짜별로 파일을 정렬하는 방법

lastmoon 2023. 7. 26. 22:23
반응형

PHP에서 날짜별로 파일을 정렬하는 방법

현재 동일한 디렉토리에 있는 파일 목록을 출력할 수 있는 스크립트가 있습니다.

출력에는 이름이 표시되고, 그리고 나서 저는filemtime()파일이 수정된 날짜를 표시하는 함수입니다.

출력을 어떻게 정렬하여 최신 수정 파일을 표시합니까?

이것이 현재 제가 가지고 있는 것입니다.

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 "$file - $lastModified";
            }
        }
    }
    closedir($handle);
}

이렇게 하면 확장명이 .swf인 경로/to/파일의 모든 파일을 배열로 가져온 다음 파일의 mtime을 기준으로 배열을 정렬할 수 있습니다.

$files = glob('path/to/files/*.swf');
usort($files, function($a, $b) {
    return filemtime($b) - filemtime($a);
});

위는 람다 함수를 사용하고 PHP 5.3을 필요로 합니다. 5.3 이전에는

usort($files, create_function('$a,$b', 'return filemtime($b)-filemtime($a);'));

익명 함수를 사용하지 않으려면 콜백을 일반 함수로 정의하고 대신 함수 이름을 에 전달할 수 있습니다.

결과 배열을 사용하면 다음과 같이 파일을 반복할 수 있습니다.

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

파일을 정렬할 때 이미 호출했기 때문에 각 루프에서 다시 호출할 때 stat 캐시로 인해 추가 비용이 발생하지 않습니다.

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

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

테스트되지는 않았지만, 그렇게 하는 것입니다.

다음은 재귀 디렉터리를 사용하는 예제입니다.반복기 클래스입니다.파일 시스템에서 반복적으로 반복할 수 있는 편리한 방법입니다.

$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];
});
$files = array_diff(scandir($dir,SCANDIR_SORT_DESCENDING), array('..', '.'));
print_r($files);

나는 당신이 제안한 정확한 코드를 몇 줄만 추가해서 사용합니다.이 아이디어는 엘리어스가 제안한 것과 거의 동일하지만 디렉터리의 각 파일 이름이 다르므로 이 솔루션에서는 키에 충돌이 발생할 수 없습니다. 따라서 이 파일을 키에 추가하면 충돌이 해결됩니다.

키의 첫 번째 부분은 두 개를 사전 기록적으로 비교할 수 있도록 포맷된 날짜/시간 문자열입니다.

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

성능 최적화(반복된 총 함수 호출 수 최소화)에 필사적으로 집중하는 사용자는 파일 수정 시간을 첫 번째 요소로 저장하고 파일 이름을 행 배열의 두 번째 요소로 저장할 수 있습니다.

이 설정이 완료되면 간단히 전화를 걸 수 있습니다.sort()그리고 알고리즘은 먼저 모드 시간으로 비교한 다음 고유한 파일 이름을 사용하여 연결을 끊습니다.

코드: (데모)

$result = [];
foreach (glob('path/to/files/*.swf') as $file) {
    $result[] = [filemtime($file), $file];
}
sort($result);
var_export($result);

*참고: 파일 이름 앞에 경로를 추가하지 않으려면 ($file), 그런 다음 사용합니다.chdir('path/to/files')를 걸기 에 대상 로 이동합니다.glob().

하면 주식기준을 사용합니다.sort()는 모든 행의 모든 요소에 대해 ASC에 잠겨 있음을 의미합니다.뿐만 아니라.rsort()모든 열을 DESC 순서로 정렬합니다.이러한 결과는 일부 상황에서 만족스럽지 못합니다.모드 시간을 음의 정수로 저장하여 파일 이름 알파벳화와 반대되는 모드 시간 정렬을 해킹할 수 있다고 생각합니다.소화 중입니다.

언급URL : https://stackoverflow.com/questions/2667065/how-to-sort-files-by-date-in-php

반응형