使用asort()对日期排序数组无法正常工作

时间:2014-04-25 15:46:23

标签: php arrays sorting

这是未排序的数组,格式为dd-mm-yyyy:

array(6) { 
["7-0"]=> string(10) "28-04-2014" 
["7-1"]=> string(10) "29-04-2014"
["7-2"]=> string(10) "30-04-2014" 
["7-3"]=> string(10) "01-05-2014" 
["7-5"]=> string(10) "26-04-2014" 
["7-6"]=> string(10) "27-04-2014" 
}

我现在正在使用排序:

array(6) { 
["7-3"]=> string(10) "01-05-2014" 
["7-5"]=> string(10) "26-04-2014" 
["7-6"]=> string(10) "27-04-2014" 
["7-0"]=> string(10) "28-04-2014" 
["7-1"]=> string(10) "29-04-2014"
["7-2"]=> string(10) "30-04-2014" 
}

通过使用asort()按值对数组进行排序,但是现在首先是01。有什么办法让我解决这个简单的方法吗?它应该是数组中的最后一个,因此它在下个月。 (2014年1月5日)

更新

上面是asort()之前和之后的var_dump()响应。以下是代码段。在不同的尝试之后,asort()一直工作到本周大约在月末 - 然后数组没有正确排序。

$openhours_select = array();
foreach($openhours as $oh)
{
        $d = date('d-m-Y', strtotime('this ' . $days[$oh['fromDay']]));

        $openhours_select[$oh['id']] =$d;

}

asort($openhours_select);

2 个答案:

答案 0 :(得分:4)

这些日期的排序格式不佳。您应该以ISO-8601格式存储日期,这些格式易于排序,然后在需要时重新格式化。

但要解决此问题,您可以使用DateTime::createFromFormat()将日期读入可比较的格式,然后对其进行排序。

uasort($openhours_select, function($a, $b) {
    $date1 = DateTime::createFromFormat('d-m-Y', $a);
    $date2 = DateTime::createFromFormat('d-m-Y', $b);
    return $date1 > $date2;
});

答案 1 :(得分:1)

需要将其转换为更好的格式,并根据实际日期进行排序:

array_multisort(array_map('strtotime', $array), SORT_ASC, $array);

DEMO