【问题标题】:PHP - group the array based on datePHP - 根据日期对数组进行分组
【发布时间】:2016-05-09 15:03:57
【问题描述】:

我有这样的数组:

$events = [

[
  'title' => 'Event 1',
  'description' => 'Some Text',
  'date_added' => 2016-05-06 14:57:39
],

[
  'title' => 'Event 2',
  'description' => 'Some Text',
  'date_added' => 2016-05-08 14:57:39
],
[
  'title' => 'Event 3',
  'description' => 'Some Text',
  'date_added' => 2016-05-09 14:57:39
],
[
  'title' => 'Event 4',
  'description' => 'Some Text',
  'date_added' => 2016-05-09 15:57:39
]

];

我需要这样显示数据:

**Today events:**
Event 4,
Event 3

**Yesterday events**
Event 2

**May 6th events**
Event 1

我该怎么做?有可能吗?

【问题讨论】:

  • 遍历数组并使用日期作为键并将值作为数组添加到键
  • 你试过了吗?请给我们一些代码。
  • 这个问题相当广泛。问题是排序吗?分组?或将日期转换为“今天”和“昨天”。
  • 第二个 - 我想在今天的列表中显示今天的所有事件,在昨天的列表中显示昨天的事件等等。

标签: php arrays sorting datetime


【解决方案1】:

这完全符合您的要求。试试这个:

首先,我们需要按日期对记录进行排序。我们可以为此使用usort() 函数。

function compare_date($a, $b) {

    if ($a['date_added'] === $b['date_added']){
        return 0;
    }

    return ($a['date_added'] > $b['date_added']) ? -1 : 1;
}

usort($events, "compare_date");

接下来,我们将创建一个自定义数组来保存标题日期。

foreach($events as $event) {

    $today_date =   strtotime(date("Y-m-d H:i:s"));
    $event_date =   strtotime($event['date_added']);
    $diff       =   floor(($today_date - $event_date)/(60*60*24));

    switch($diff) {
        case 0:
            $title             = "Today events:<br/>";
            $result[$title][]  = $event['title'];
            break;
        case 1:
            $title             =  "Yesterday events:<br/>";
            $result[$title][]  =  $event['title'];
            break;
        default:
            $title             = date("M jS", $event_date)." Events:<br/>";
            $result[$title][]  = $event['title'];
    }
}

最后,我们正在遍历这个 $result 并显示所需的输出。

foreach($result as $k => $rslt) {

    echo $k;
    echo implode("<br>", $rslt);
    echo "<br/>";
}

【讨论】:

    【解决方案2】:

    你可以使用 usort() 来做到这一点:

    function date_compare($a, $b) {
        $t1 = strtotime($a['date_added']);
        $t2 = strtotime($b['date_added']);
        return $t1 - $t2;
    }    
    usort($events, 'date_compare');
    

    要显示它们,您可以使用以下 foreach 语句:

    foreach ($events as $key) {
        $dt = new DateTime($key['date_added']);
        $date =  $dt->format('F j');
        if($current != $date) {
            $current = $date;
            echo "<br>**".$date." events:**<br>";
        }
        echo $key["title"]."<br>";
    }
    

    输出:

    **May 1 events:**
    Event 3
    
    **May 3 events:**
    Event 1
    
    **May 8 events:**
    Event 2
    
    **May 9 events:**
    Event 4
    

    希望此解决方案有效。祝你一切顺利。

    【讨论】:

      【解决方案3】:

      你也可以试试这个:

      // method to compare two values
      function compare_date($a, $b) {
      
          if ($a['date_added'] === $b['date_added']){
              return 0;
          }
      
          return ($a['date_added'] > $b['date_added']) ? -1 : 1;
      }
      
      // callback function
      usort($events, "compare_date");
      
      $today = date("Y-m-d");
      $yesterday = date('Y-m-d', strtotime("yesterday"));
      
      $myEvents = array();
      
      foreach ($events as $key => $val) : 
          $datetime = new DateTime($val['date_added']);
          $record_date = $datetime->format('Y-m-d');
      
          if ($today == $record_date):
              $myEvents['today'][] = $events[$key];
          elseif ($yesterday == $record_date):
              $myEvents['yesterday'][] = $events[$key];
          else :
              $myEvents[$record_date][] = $events[$key];
          endif;  
      endforeach;
      
      // display event
      foreach($myEvents as $i => $v):
          if ($i!="today" && $i!="yesterday"):
              echo date('M d', strtotime($i)) . "<br>";       
          else :
              echo $i . "<br>";
          endif;
      
          foreach ($v as $e):
              echo $e['title'] . "<br>";
          endforeach;
          echo "<br>";
      endforeach;
      

      上面的代码输出是:

      今天

      事件 4

      活动 3

      昨天

      事件 2

      5 月 6 日

      事件 1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-05
        • 2014-12-23
        • 2016-10-08
        相关资源
        最近更新 更多