首页 > 解决方案 > PHP中的日期数组排序

问题描述

有没有可能用这种日期类型的值对数组进行排序?

$dates = [
    "June 8-12",
    "June 15-19",
    "June 22-26",
    "June 29 - July 2",
    "July 10-24",
    "July 6-10",
    "July 27-31",
    "July 13-17",
    "July 20-24",
    "July 8",
    "August 3-7",
    "August 10-14"
];

标签: phpsorting

解决方案


这是一个可能的解决方案。

首先,我截断间隔以仅保留开始日期(我认为这是最合乎逻辑的做法,但您可以根据自己的需要进行调整)。

然后,我构建日期对象(并采用闰年以避免 2 月 29 日出现问题)。

最后,您可以依靠日期对象比较对日期进行排序:

$dates = [
    "June 8-12",
    "June 15-19",
    "June 22-26",
    "June 29 - July 2",
    "July 10-24",
    "July 6-10",
    "July 27-31",
    "July 13-17",
    "July 20-24",
    "July 8",
    "August 3-7",
    "August 10-14",
];

function myCompDates($s1, $s2)
{
    // if interval, keep only the begin date
    if(strpos($s1, '-') !== false) $s1 = trim(explode('-', $s1)[0]) ;
    if(strpos($s2, '-') !== false) $s2 = trim(explode('-', $s2)[0]) ;
    
    // create Date object for both string
    $d1 = DateTime::createFromFormat('Y F d', '2004 ' . $s1);
    $d2 = DateTime::createFromFormat('Y F d', '2004 ' . $s2);
    
    // use date object comparison
    if( $d1 == $d2 ) return 0 ;
    elseif($d1 < $d2) return -1 ;
    else return 1 ;
}

usort($dates, 'myCompDates');

print_r($dates);

输出 :

大批

(

[0] => 6 月 8 日至 12 日

[1] => 6 月 15 日至 19 日

[2] => 6 月 22 日至 26 日

[3] => 6 月 29 日 - 7 月 2 日

[4] => 7 月 6 日至 10 日

[5] => 7 月 8 日

[6] => 7 月 10 日至 24 日

[7] => 7 月 13 日至 17 日

[8] => 7 月 20 日至 24 日

[9] => 7 月 27 日至 31 日

[10] => 8 月 3 日至 7 日

[11] => 8 月 10 日至 14 日

)


推荐阅读