根据时间将数据拆分为三个数组

时间:2015-05-27 11:52:03

标签: php arrays datetime laravel

我想根据时间将数据数组拆分为三个数组 - 过去,今天,之后。

对于今天的阵列,只有具有今天日期和时间大于今天的时间的数据应该存在。

这是我的代码。它没有错误(据我所知)。我得到了理想的结果,但我想知道这段代码是否可以更优化。

$current_date = date('Y-m-d');
$current_time = date('H:i:s');

foreach($data as $key => $value) {
    if(date('Y-m-d', $value->meeting_scheduled_at) > $current_date) {
        $calendar_data['later'][] = $value;
    } elseif (date('Y-m-d', $value->meeting_scheduled_at) < $current_date
              || ( (date('Y-m-d', $value->meeting_scheduled_at) == $current_date) 
                   && (date('H:i:s', $value->meeting_scheduled_at) < $current_time) )
    ) {
        $calendar_data['past'][] = $value;
    } else {
        $calendar_data['now'][] = $value;
    }
}

$value->meeting_scheduled_at是时间戳

编辑:我在Laravel项目中使用它。

因此,如果会议安排在今天的会议日期,时间是晚上6点。它将进入今天阵列直到下午6点。下午6点后,它进入过去的阵列。简而言之,除非并且直到第二天,否则在后面的数组中不应该存在任何内容。

4 个答案:

答案 0 :(得分:2)

在条件中使用结果之前,

date('Y-m-d', $value->meeting_scheduled_at)只应计算一次。

答案 1 :(得分:2)

我喜欢将DateTime类用于此类事情。它考虑了夏令时等,可以很容易地进行比较。

$now         = new DateTime();
$tomorrow    = new DateTime();
$meetingDate = new DateTime();

$tomorrow->add(new DateInterval('P1D'))->setTime(0,0,0);

foreach ($data as $key => $value) {
    $meetingDate->setTimestamp($value->meeting_scheduled_at);

    // if $value->meeting_scheduled_at format YYYY-MM-DD then
    // we'd create the $meetingDate object here like this
    // $meetingDate = new DateTime($value->meeting_scheduled_at);

    if ($meetingDate < $now) {
        $calendar_data['past'][] = $value;
    } else if ($meetingDate >= $tomorrow) {
        $calendar_data['later'][] = $value;
    } else {
        $calendar_data['now'][] = $value;
    }
}

答案 2 :(得分:1)

让它更容易

$now = time();
// Midnight due to discussion with Kevin Nagurski in comments :) 
$tommorow = strtotime('tomorrow');
foreach($data as $key => $value) 
    if ($value->meeting_scheduled_at) < $now) $calendar_data['past'][] = $value;
    elseif ($value->meeting_scheduled_at) >= $tommorow) $calendar_data['later'][] = $value;
    else $calendar_data['now'][] = $value;

答案 3 :(得分:1)

您可以使用时间戳。

$now = time();
$today_limt = strtotime("today 6 PM");

 foreach($data as $key => $value) {
        $meeting_time = strtotime($value->meeting_scheduled_at);
        if($meeting_time > $today_limit) {
            $calendar_data['later'][] = $value;
        } elseif($meeting_time < $now) {
            $calendar_data['past'][] = $value;
        } else {
            $calendar_data['now'][] = $value;

        }
 }