PHP按日期、时间、名称排序scandir返回的文件夹列表
解决方案
核心思路
用PHP的usort()自定义排序规则,从每个文件夹名称里提取日期、时间、名称三个关键信息,把日期转成时间戳后按「日期→时间→名称字母」的优先级依次比较排序。
实现代码
<?php $targetDir = './your-folder-path'; // 替换成你的目标目录 $dirItems = scandir($targetDir); // 筛选出真正的子文件夹,排除.和.. $folders = array_filter($dirItems, function($item) use ($targetDir) { $fullPath = $targetDir . DIRECTORY_SEPARATOR . $item; return is_dir($fullPath) && $item !== '.' && $item !== '..'; }); // 自定义排序逻辑 usort($folders, function($folderA, $folderB) { $infoA = parseFolderInfo($folderA); $infoB = parseFolderInfo($folderB); // 先比日期(时间戳越大越新) if ($infoA['timestamp'] !== $infoB['timestamp']) { return $infoA['timestamp'] < $infoB['timestamp'] ? -1 : 1; } // 日期相同比时间 if ($infoA['time'] !== $infoB['time']) { return strcmp($infoA['time'], $infoB['time']); } // 时间相同比名称字母顺序 return strcmp($infoA['name'], $infoB['name']); }); // 解析文件夹名称的辅助函数 function parseFolderInfo($folderName) { $segments = explode(' - ', $folderName); $name = $segments[0]; $time = ''; $dateStr = ''; // 判断是哪种命名格式 if (count($segments) === 3) { // 格式:名称 - 时:分 - 日/月/年 $time = $segments[1]; $dateStr = str_replace('/', '-', $segments[2]); // 替换分隔符让strtotime能识别 } elseif (count($segments) === 4) { // 格式:名称 - 手机号 - 时:分 - 日-月-年 $time = $segments[2]; $dateStr = $segments[3]; } // 拼接成完整时间字符串,转成时间戳 $fullTime = $dateStr . ' ' . $time; $timestamp = strtotime($fullTime); return [ 'name' => $name, 'time' => $time, 'timestamp' => $timestamp ]; } // 输出排序后的结果 print_r($folders); ?>
关键说明
- 文件夹筛选:用
array_filter过滤掉非文件夹的项和系统默认的.、..目录。 - 名称解析:通过
explode(' - ', $folderName)拆分名称,根据拆分后的片段数量判断格式,提取对应的字段;把日期的/替换成-是为了让strtotime能正确解析日期格式。 - 排序优先级:先按日期时间戳排序(确保新日期在后),日期相同则比较时分字符串,最后比较名称的字母顺序(用
strcmp做标准字符串比较)。
注意点
- 如果有不符合两种格式的文件夹,
strtotime会返回false,这类文件夹会排在最前面,你可以在解析函数里加判断处理这类情况。 - 如果你的日期格式不是日/月/年或日-月-年,需要调整解析逻辑来适配。
内容的提问来源于stack exchange,提问作者Joao Pedro Baza
相关产品推荐
相关产品推荐

