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
相关产品推荐
相关产品推荐

