【问题标题】:Sort multi-dimensional array by child key date?按子键日期对多维数组进行排序?
【发布时间】:2011-04-25 10:04:08
【问题描述】:

我有以下数组:

[0] => Array
        (
            [name] => The Name
            [description] => description
            [date] => Thur, May 5 @ 7:00 p.m.
            [rating] => PG
            [year] => 2011
        )

[1] => Array
        (
            [name] => Name 2
            [description] => description 2
            [date] => Sun, May 8 @ 7:30 p.m.
            [rating] => 14A
            [year] => 2011
        )

还有大约 5-10 个零件。

我最终想要做的是使用数组的日期部分按天对这些项目进行分组(即,“所有“日期”落入“5 月 8 日”的项目都应该这样分组)。

知道我会怎么做吗?请注意,“日期”字段按原样存储在 DB 中——这不是从 date() 转换而来的时间戳;或其他。

非常感谢!

【问题讨论】:

    标签: php arrays sorting multidimensional-array


    【解决方案1】:

    创建您自己的排序函数并使用usort 调用它。

    例如(不考虑时间戳格式的复杂性):

    function date_sort($a, $b) {
      return strcmp($a['date'], $b['date']); //only doing string comparison
    }
    
    usort($array, 'date_sort');
    

    要完成 date_sort,您需要以某种方式将日期转换为可比较的类型。这是一个将它们转换为 UNIX 时间戳的解决方案:

    function convert_date($time) {
      $time = substr($time, strpos($time, ',')+1);
      $time = str_replace('@', ',', $time);
      $time = str_replace('.', '', $time);
      return strtotime($time);
    }
    
    function date_sort($a, $b) {
      $a = convert_date($a['date']);
      $b = convert_date($b['date']);
    
      if ($a == $b) {
        return 0;
      }
      return ($a < $b) ? -1 : 1;
    }
    

    【讨论】:

    • 这完全有效;万分感谢!就是说-我仍然遇到问题。在上面的示例中,我只有一个数字作为数组键(即第一个元素),但实际上,数组键是帖子的 slug(即随机字符串)。运行 usort 后,数组键被转换为数字。有什么办法吗?
    • 没关系! uasort();代替 usort();成功了。谢谢,并为延迟接受这个作为我的答案道歉!
    【解决方案2】:

    使用@Emil Vikström 解决方案,以strtotime 作为比较函数

    函数日期排序($a, $b) {

    $a = strtotime($a['date']); $b = strtotime($b['date']);

    返回 ($a == $b) ? 0 : ($a>$b ? - 1 : 1);

    }

    usort($array, 'date_sort');

    http://fr2.php.net/manual/en/function.strtotime.php 应该处理大多数用英文写的文本日期。

    【讨论】:

    • strtotime 不处理这种格式,但我已经用一个函数更新了我的答案,该函数将原始格式转换为 strtotime 可以理解的格式。
    【解决方案3】:

    试试这个

    $arrArray 有你指定的数组;

    $newArray = array();
    foreach($arrArray as $key => $value){
    
        $date1 = substr($value['date'], 0, strpos($value['date'],'@')-1);
        $newArray[$date1][] = $value;
    
    
    }
    print_r($newArray);
    

    【讨论】:

      【解决方案4】:

      要按日期对数据进行分组,请运行这个小循环

      $sortedArray = array();
      foreach($dataListing as $data){
           //parse your $date field with an reg exp and transform it into integer with format MMDD
           $sortedArray[$dateIntegerFormated][] = $data;
      }
      ksort($sortedArray);
      $sortedArray = array_values($sortedArray);
      

      您可以使用 usort 按时间排序到每个组中

      【讨论】:

        猜你喜欢
        • 2016-10-31
        • 2013-11-30
        • 1970-01-01
        • 2021-09-19
        • 2013-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多