排序包含月份和年份的字符串 - '可能 - 2016'

时间:2017-05-19 12:41:16

标签: php arrays string algorithm sorting

说明

我有一个assosiative数组,用于存储特定月份和年份的文章计数。它看起来像这样:

[
'april 2017' => 5,
'may 2017' => 5,
'december 2014' => 5,
'april 2016' => 5,
]

问题:

此数组必须从最新到最旧排序。我无法想出解决这个排序问题的方法。我正在考虑使用爆炸功能,但随后价值不再有序,没有任何意义。有其他人有这个问题吗?

解决问题的最佳方法/方法是什么?

3 个答案:

答案 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);