我目前有一个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);
}
Run Code Online (Sandbox Code Playgroud)
Gor*_*don 159
这会将带有.swf扩展名的path/to/files中的所有文件放入一个数组中,然后按文件的mtime对该数组进行排序
$files = glob('path/to/files/*.swf');
usort($files, function($a, $b) {
return filemtime($a) < filemtime($b);
});
Run Code Online (Sandbox Code Playgroud)
以上使用Lambda函数,需要PHP 5.3.在5.3之前,你会这样做
usort($files, create_function('$a,$b', 'return filemtime($a)<filemtime($b);'));
Run Code Online (Sandbox Code Playgroud)
如果您不想使用匿名函数,您也可以将回调定义为常规函数,并将函数名称传递给它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)));
}
Run Code Online (Sandbox Code Playgroud)
请注意,因为您filemtime在排序文件时已经调用过,所以由于stat缓存而在foreach循环中再次调用它时没有额外的成本.
eli*_*ias 19
您需要将文件放入数组中,以便对最后修改的文件进行排序和查找.
$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>";
}
}
}
Run Code Online (Sandbox Code Playgroud)
没有经过测试,但这是怎么做的.
Dan*_*jel 10
使用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];
});
Run Code Online (Sandbox Code Playgroud)