【问题标题】:Sorting string which contains month and year - 'may - 2016'包含月份和年份的排序字符串 - 'may - 2016'
【发布时间】:2017-05-19 12:41:16
【问题描述】:

说明:

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

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

问题:

这个数组必须从最新到最旧排序。我想不出解决这个排序问题的方法。我正在考虑使用explode函数,但是这些值不再排序并且没有意义。其他人有这个问题吗?

解决它的最佳方法/方式是什么?

【问题讨论】:

  • 不要使用 may 2017 之类的键构建关联数组,而是使用 201705 之类的键并使用 ksort 按键排序。

标签: php arrays string algorithm sorting


【解决方案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。在这种情况下,代码不会失败,但结果将是不可预知的。

【讨论】:

    【解决方案2】:

    您可以在'april 2017' 等日期字符串上使用strtotime() 来获取可比较的数据。

    一旦你有了这个,只需找到一个符合你需要的排序算法:https://en.wikipedia.org/wiki/Sorting_algorithm。 此选择将取决于数据在数组中的存储方式。

    【讨论】:

      【解决方案3】:

      试试这个:

      $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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-01
        • 1970-01-01
        • 2020-08-15
        • 2017-03-04
        • 1970-01-01
        • 1970-01-01
        • 2012-02-17
        相关资源
        最近更新 更多