PHP 7.4如何正确对含日期的视频文件名数组升序排序?
解决PHP按视频文件名时间排序的问题
问题原因
你之前用filemtime排序失败,核心原因是文件的实际修改时间和文件名中记录的时间不匹配——比如文件被复制、移动过,filemtime返回的是最后修改时间,而非文件名里的事件发生时间,自然没法得到正确的排序结果。
正确解决方案
应该直接从文件名中提取时间字符串,转换成可比较的时间戳后排序,这才是可靠的方式。以下是具体实现:
代码实现
usort($videoFiles, function($a, $b) { // 内部函数:从文件路径提取对应时间戳 $extractTimestamp = function($filePath) { // 匹配文件名中的时间分段:DD、MM、YY、HH、MM、SS if (!preg_match('/event\d+-(\d{2})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})\.mp4/', basename($filePath), $matches)) { // 格式不符的文件默认返回0,会排在结果最后 return 0; } // 解析匹配到的时间分量 $year = 2000 + (int)$matches[3]; $month = (int)$matches[2]; $day = (int)$matches[1]; $hour = (int)$matches[4]; $minute = (int)$matches[5]; $second = (int)$matches[6]; // 生成时间戳 $date = new DateTime(); $date->setDate($year, $month, $day); $date->setTime($hour, $minute, $second); return $date->getTimestamp(); }; // 比较两个文件的时间戳,实现从早到晚排序 $tsA = $extractTimestamp($a); $tsB = $extractTimestamp($b); return $tsA - $tsB; });
代码说明
- 正则匹配:精准提取文件名中的日、月、年、时、分、秒各部分,确保时间信息的准确性。
- 时间转换:将提取的时间分量组合为
DateTime对象,转成可直接比较的时间戳。 - 排序逻辑:通过
usort比较时间戳数值,实现按事件时间从早到晚排序。
补充说明
如果文件名格式严格统一,可以简化正则表达式;若存在格式不规范的文件,代码会默认将其排在结果末尾,你也可根据需求调整这部分处理逻辑。
内容的提问来源于stack exchange,提问作者Aditya K
相关产品推荐
相关产品推荐

