说明
我有一个assosiative数组,用于存储特定月份和年份的文章计数。它看起来像这样:
[
'april 2017' => 5,
'may 2017' => 5,
'december 2014' => 5,
'april 2016' => 5,
]
问题:
此数组必须从最新到最旧排序。我无法想出解决这个排序问题的方法。我正在考虑使用爆炸功能,但随后价值不再有序,没有任何意义。有其他人有这个问题吗?
解决问题的最佳方法/方法是什么?
答案 0 :(得分:1)
有几种解决方案。这里只有两个。
您可以使用uksort
功能:
uksort($array, function ($a, $b) {
return strtotime($a) - strtotime($b);
});
或者您可以使用array_multisort
功能:
array_multisort(array_map('strtotime', array_keys($array)), $array);
他们都使用strtotime
将字符串日期表示转换为时间戳,然后比较时间戳。
这是working demo。
注意这个事实,这只是一个概念。这意味着,如果您的日期密钥无效,此代码将无法捕获解析错误,strtotime
可以返回false
。在这种情况下,代码不会失败,但结果将是不可预测的。
答案 1 :(得分:0)
您可以在日期字符串strtotime()
上使用'april 2017'
来获取可比数据。
完成后,只需找到符合您需求的排序算法:https://en.wikipedia.org/wiki/Sorting_algorithm。 此选择取决于数据存储在数组中的方式。
答案 2 :(得分:0)
试试这个:
$array = [
'april 2017' => 5,
'may 2017' => 6,
'december 2014' => 3,
'april 2016' => 4,
];
function order_date($a1,$b1) {
$format = 'M Y';
$a = strtotime(date_format(DateTime::createFromFormat($format, $a1), 'Y-m-d H:i:s'));
$b = strtotime(date_format(DateTime::createFromFormat($format, $b1), 'Y-m-d H:i:s'));
if ($a == $b)
{
return 0;
}
else if ($a > $b)
{
return 1;
}
else {
return -1;
}
}
uksort($array, "order_date");
print_r($array);