You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
});

代码说明

  1. 正则匹配:精准提取文件名中的日、月、年、时、分、秒各部分,确保时间信息的准确性。
  2. 时间转换:将提取的时间分量组合为DateTime对象,转成可直接比较的时间戳。
  3. 排序逻辑:通过usort比较时间戳数值,实现按事件时间从早到晚排序。

补充说明

如果文件名格式严格统一,可以简化正则表达式;若存在格式不规范的文件,代码会默认将其排在结果末尾,你也可根据需求调整这部分处理逻辑。

内容的提问来源于stack exchange,提问作者Aditya K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 22:53:21