PHP readdir()返回文件无序,如何按文件名或上传日期排序?
当然可以实现!你当前的代码是直接读取系统返回的原始文件顺序就输出,所以没法控制排序逻辑。我们只需要先把所有符合条件的文件收集到数组里,再根据需求排序后生成链接列表就行,两种排序方式都很容易做到:
1. 按文件名排序
推荐用自然排序(natsort),这种排序方式更符合人类的阅读习惯——比如带数字的文件名file10会排在file2后面,而普通字符串排序会把file10错误地放在file2前面。
完整代码示例:
<?php $targetDir = './xyz'; $fileList = []; // 读取目录并收集有效文件 if ($handle = opendir($targetDir)) { while (false !== ($file = readdir($handle))) { if ($file !== "." && $file !== "..") { $fileList[] = $file; } } closedir($handle); // 执行自然排序 natsort($fileList); // 如果需要倒序排列,排序后加上这一行 // $fileList = array_reverse($fileList); } // 生成带链接的列表项 $output = ''; foreach ($fileList as $file) { $output .= '<li><a href="./abc/xyz/'.$file.'">'.$file.'</a></li>'; } ?> <h1>List of files:</h1> <ul><?php echo $output; ?></ul>
2. 按文件修改日期(近似“上传日期”)排序
PHP里没有直接的“上传日期”字段,通常我们用文件修改时间(filemtime,指文件内容最后被修改的时间)来近似——这个值在文件上传后一般不会变动,很适合用来排序。如果需要严格的创建时间,可以用filectime,但要注意:Linux系统下filectime是文件元数据(比如权限)的修改时间,Windows下才是文件的创建时间,所以filemtime兼容性更好。
完整代码示例:
<?php $targetDir = './xyz'; $fileWithTime = []; // 读取目录并收集文件+对应的修改时间 if ($handle = opendir($targetDir)) { while (false !== ($file = readdir($handle))) { if ($file !== "." && $file !== "..") { // 拼接完整文件路径,获取修改时间 $filePath = $targetDir . '/' . $file; $fileWithTime[$file] = filemtime($filePath); } } closedir($handle); // 按修改时间升序排列(旧文件在前) asort($fileWithTime); // 如果要新文件在前,改用降序排序 // arsort($fileWithTime); } // 生成带日期的列表项 $output = ''; foreach ($fileWithTime as $file => $modifyTime) { // 把时间戳转成可读格式 $formattedTime = date('Y-m-d H:i:s', $modifyTime); $output .= '<li><a href="./abc/xyz/'.$file.'">'.$file.'</a> - '.$formattedTime.'</li>'; } ?> <h1>List of files (sorted by modified date):</h1> <ul><?php echo $output; ?></ul>
小提示
- 确保
$targetDir的路径正确,避免因路径错误导致无法获取文件时间 - 如果需要更复杂的排序逻辑(比如先按文件类型再按日期),可以用
usort()自定义排序规则
内容的提问来源于stack exchange,提问作者Devon Fisher
相关产品推荐
相关产品推荐

