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

PHP中按两位年份+月份对二维数组进行升序排序的问题

PHP二维数组按自定义日期格式排序解决方案

当二维数组的子数组首元素为Mar-17这类两位年份的日期格式时,直接使用字符串比较的usort逻辑只能实现字母排序,无法满足「先年份后月份」的升序要求。以下是两种可靠的实现方案:

方案一:利用DateTime对象转换比较

通过DateTime::createFromFormat将日期字符串转换为可比较的日期对象,再通过时间戳实现正确排序:

usort($data, fn($a, $b) => 
    DateTime::createFromFormat('M-y', $a[0])->getTimestamp() 
    <=> 
    DateTime::createFromFormat('M-y', $b[0])->getTimestamp()
);

该方法自动处理月份和年份的数值映射,无需手动维护月份对照表,代码简洁且不易出错。

方案二:手动解析月份与年份数值比较

如果需要更灵活的年份世纪控制(比如指定两位年份对应19xx或20xx),可以手动拆分日期字符串,通过数值比较实现排序:

// 定义月份缩写到数字的映射表
$monthMap = [
    'Jan' => 1, 'Feb' => 2, 'Mar' => 3, 'Apr' => 4,
    'May' => 5, 'Jun' => 6, 'Jul' => 7, 'Aug' => 8,
    'Sep' => 9, 'Oct' => 10, 'Nov' => 11, 'Dec' => 12
];

usort($data, function($a, $b) use ($monthMap) {
    // 拆分日期字符串为月份和年份
    [$monthA, $yearA] = explode('-', $a[0]);
    [$monthB, $yearB] = explode('-', $b[0]);
    
    // 先比较年份,年份相同则比较月份
    return $yearA != $yearB 
        ? $yearA <=> $yearB 
        : $monthMap[$monthA] <=> $monthMap[$monthB];
});

若需指定年份世纪,可在比较前对$yearA和$yearB做拼接处理,比如$yearA = '20' . $yearA。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 10:38:12