
本文介绍使用 php 递归遍历指定目录(含所有子目录),提取全部文件并按最后修改时间从新到旧排序,最终返回包含相对路径与时间戳的结构化数组。
本文介绍使用 php 递归遍历指定目录(含所有子目录),提取全部文件并按最后修改时间从新到旧排序,最终返回包含相对路径与时间戳的结构化数组。
要实现“获取目录及所有子目录中最新(按修改时间)到最旧的文件列表”,关键在于两点:深度遍历(递归访问所有嵌套子目录)和统一时间排序(基于 filemtime() 而非文件名)。scandir() 本身不支持跨层级排序,因此需手动收集所有文件信息后再集中排序。
以下是一个健壮、可复用的 PHP 函数:
function getLatestFilesRecursively($dir, $baseDir = null) {
if ($baseDir === null) {
$baseDir = $dir;
}
$results = [];
$files = scandir($dir);
foreach ($files as $value) {
// 跳过当前目录和父目录符号
if ($value === '.' || $value === '..') {
continue;
}
$path = $dir . DIRECTORY_SEPARATOR . $value;
$realPath = realpath($path);
if ($realPath === false) {
continue; // 跳过无效链接或权限不足路径
}
if (is_file($realPath)) {
// 保存相对于 baseDir 的路径(如 Folder1/File135646.txt),便于阅读
$relativePath = str_replace($baseDir . DIRECTORY_SEPARATOR, '', $realPath);
$results[] = [
'path' => $relativePath,
'mtime' => filemtime($realPath)
];
} elseif (is_dir($realPath)) {
// 递归进入子目录
$subResults = getLatestFilesRecursively($realPath, $baseDir);
$results = array_merge($results, $subResults);
}
}
// 按修改时间降序排列:最新 → 最旧
usort($results, function($a, $b) {
return $b['mtime'] $a['mtime']; // 注意:$b 在前实现降序
});
return $results;
}
✅ 使用示例:
$mainFolder = '/path/to/MainFolder'; $sortedFiles = getLatestFilesRecursively($mainFolder); // 提取仅 path 字段(符合问题要求的纯路径数组) $pathsOnly = array_column($sortedFiles, 'path'); print_r($pathsOnly); // 输出类似: // Array ( // [0] => Folder1/File135646.txt // [1] => Folder2/File467456.txt // [2] => Folder2/File745674.txt // [3] => Folder1/File341324.txt // )
⚠️ 注意事项:
-
filemtime()返回 Unix 时间戳(秒级),适用于常规场景;若需纳秒精度或创建时间,请改用filectime()或splFileInfo类。 - 函数自动跳过符号链接失效、无读取权限的条目,增强鲁棒性。
- 若目录层级极深或文件数量极大,建议增加递归深度限制或改用
RecursiveIteratorIterator+RecursiveDirectoryIterator(性能更优、内存更可控)。 - 路径分隔符使用
DIRECTORY_SEPARATOR确保 Windows/Linux 兼容。
该方案简洁、可扩展,是处理多级目录文件时间排序任务的标准实践。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











