
本文介绍一种使用递归函数遍历指定目录(含子目录)中所有文件,并依据最后修改时间从新到旧排序的完整解决方案,返回包含路径与时间戳的结构化数组。
本文介绍一种使用递归函数遍历指定目录(含子目录)中所有文件,并依据最后修改时间从新到旧排序的完整解决方案,返回包含路径与时间戳的结构化数组。
要实现“获取目录及其所有子目录中最新文件并按修改时间降序排列”,关键在于两点:深度遍历(递归扫描子目录)和时间排序(基于 filemtime())。PHP 原生的 scandir() 仅支持单层读取,无法满足嵌套需求;而 RecursiveDirectoryIterator 虽可替代递归函数,但本方案采用更直观、可控的自定义递归方式,便于理解与调试。
以下是一个优化后的完整函数:
function getLatestFilesRecursively($dir) {
$results = [];
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS)
);
foreach ($iterator as $file) {
if ($file->isFile()) {
$results[] = [
'path' => $file->getPathname(),
'mtime' => $file->getMTime()
];
}
}
// 按修改时间降序排列(最新在前)
usort($results, function($a, $b) {
return $b['mtime'] <=> $a['mtime']; // 注意:$b 在前实现降序
});
// 提取相对路径(可选,提升可读性)
$baseLen = strlen(rtrim($dir, '/\')) + 1;
$relativeResults = array_map(function($item) use ($baseLen) {
return substr($item['path'], $baseLen);
}, $results);
return $relativeResults;
}
// 使用示例
$mainFolder = 'MainFolder';
$sortedFiles = getLatestFilesRecursively($mainFolder);
print_r($sortedFiles);✅ 输出效果(对应你的示例结构):
Array (
[0] => Folder1/File135646.txt
[1] => Folder2/File467456.txt
[2] => Folder2/File745674.txt
[3] => Folder1/File341324.txt
)⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 确保 PHP 进程对目标目录具有读取权限,否则
filemtime()或迭代器会触发警告;- 若需排除特定扩展名(如
.log),可在foreach循环中添加pathinfo($file->getFilename(), PATHINFO_EXTENSION) !== 'log'判断;- 对于超大目录,建议增加错误处理(如
try/catch包裹getMTime())并考虑内存限制;- 函数默认返回相对路径(以
$dir为根),如需绝对路径,直接返回$item['path']即可。
该方案兼顾简洁性与健壮性,避免了手动拼接路径出错的风险,同时利用 SPL 迭代器提升性能与可维护性,是生产环境中推荐的标准实践。



















