在PHP中按datesorting文件
我目前有一个index.php文件,它允许我输出同一目录内的文件列表,输出显示名称,然后我使用filemtime()函数来显示文件被修改的date。 我现在的问题是,我将如何sorting输出显示最新的修改文件?,我一直在想如何做到这一点。 如果我只是用mysql进行交互,那么根本就没有问题。 请给我一个例子如何sorting和输出从最新修改的文件开始的文件列表。 这是我现在所拥有的
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); }
您需要将这些文件放入一个数组中,以便sorting并查找最后修改的文件。
$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>"; } } }
没有testing,但这是如何做到这一点。
这将获得path/到/文件扩展名为.swf的所有文件到一个数组中,然后按该文件的mtime对该数组进行sorting
$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);'));
如果你不想使用匿名函数,那么你可以把callback函数定义为常规函数,然后将函数名称传递给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))); }
请注意,因为在对文件进行sorting时您已经调用了filemtime
,所以在foreach循环中由于statcaching而再次调用它时没有额外的开销。
一个使用RecursiveDirectoryIterator类的例子,这是一个通过文件系统recursion迭代的简便方法。
$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]; });
我使用你的确切build议的代码只有几个额外的行。 这个想法或多或less与@elias提出的想法是一样的,但是在这个解决scheme中不能有冲突,因为目录中的每个文件都有不同的文件名,因此将其添加到密钥中可以解决冲突。 关键的第一部分是date时间string格式化,使我可以按字母顺序比较其中两个。
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('Ymd 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); }