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
'programing' 카테고리의 다른 글
jQuery has Class() - 둘 이상의 클래스를 확인합니다. (0) | 2023.07.26 |
---|---|
Numpy: 첫 번째 값 인덱스를 빠르게 찾습니다. (0) | 2023.07.26 |
Spring data JPA를 사용하여 Sort 및 Pageable을 모두 사용하여 즉시 데이터를 쿼리하는 방법은 무엇입니까? (0) | 2023.07.26 |
Oracle Managed Data Access - 연결 요청 시간 초과 - 풀링 (0) | 2023.07.26 |
Grails, MySQL(MariaDB) - 더 적은 데이터에도 불구하고 max_allowed_packet 초과 (0) | 2023.07.26 |