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
'programing' 카테고리의 다른 글
openssl을 요구하거나 OpenSSL을 설치하고 ruby (권장)를 다시 빌드하거나 HTTPS가 아닌 소스를 사용할 수 없습니다. (0) | 2021.01.16 |
---|---|
F #에서 파일을 일련의 줄로 읽는 방법 (0) | 2021.01.16 |
Swift에서 문자열을 CGFloat로 변환 (0) | 2021.01.16 |
Cordova 빌드 iOS 오류 : 'path / to / myApp.xcarchive'경로에서 아카이브를 찾을 수 없습니다. (0) | 2021.01.16 |
확인 대화 상자를 만드는 Angular 2 쉬운 방법 (0) | 2021.01.16 |