查找最近和即将到来的日期

时间:2016-05-10 10:01:41

标签: php

我有一个包含事件和日期的二维数组:

$events = array(
    array('event' => 'event1', 'date' => '2016-05-05'),
    array('event' => 'event2', 'date' => '2016-05-08'),
    array('event' => 'event3', 'date' => '2016-05-08'),
    array('event' => 'event4', 'date' => '2016-05-10'),
    array('event' => 'event5', 'date' => '2016-05-10'),
    array('event' => 'event6', 'date' => '2016-05-11'),
    array('event' => 'event7', 'date' => '2016-05-11'),
    array('event' => 'event8', 'date' => '2016-05-13')
};

让我们说今天是2016-05-10,我想创建3个新数组:

  

$ recent - 所有事件都发生在上一个可用日期   $ today - 今天所有活动
  $ coming - 所有活动在下一个可用日发生

$today很简单:

$today = array();
for($i = 0; $i < count($events); ++$i) {
    if($events[$i]['date'] == date("Y-m-d") {
        array_push($today, $events[$i]['event']);
    }
}

因此,我需要$recent包含event2event3,以及$upcoming来包含event6event7

问题是如何查找recentupcoming

*澄清: 我不希望$recent中的所有事件都发生在今天之前,但事件发生在前一天。因此,在这种情况下,只有2016-05-08

上发生了事件

3 个答案:

答案 0 :(得分:3)

// Take all dates from source array
$dates = array_unique(array_map(function ($i) { return strtotime($i); } , array_column($events, 'date')));
sort($dates);
$today = strtotime('midnight');
// find previouse date. It will be 1970-1-1 if not present in array
$prev = @max(array_filter($dates, function($i) use($today) { return $i < $today; }));
// find туче date. It will be 1970-1-1 if not present in array
$next = @min(array_filter($dates, function($i) use($today) { return $i > $today; }));

$prev = date('Y-m-d', $prev);
$next = date('Y-m-d', $next);

// fill arrays
$recent = array();
$upcoming = array();
$today = array();

for($i = 0; $i < count($events); ++$i) {
    if($events[$i]['date'] == date('Y-m-d')) {
        array_push($today, $events[$i]['event']);
    }
    if($events[$i]['date'] == $prev) {
        array_push($recent, $events[$i]['event']);
    }
    if($events[$i]['date'] == $next) {
        array_push($upcoming , $events[$i]['event']);
    } 
}

答案 1 :(得分:1)

尝试创建三(3)个空白数组,检查日期是否大于或小于今天,并根据条件推入数组。

$today = array();
$upcoming = array();
$recent = array();  

$thisDay = date("Y-m-d");
$count = count($events);
$max = max(array_column($events, 'date'));
$min = min(array_column($events, 'date'));

for($i = 0; $i < $count; $i++){
    if($events[$i]['date'] > $thisDay){
        $max = ($max > $events[$i]['date']) ? $events[$i]['date'] : $max;
        array_push($upcoming, $events[$i]['event']);
        array_push($upcoming_dates, $events[$i]['date']);   
    }
    elseif($events[$i]['date'] < $thisDay){
        $min = ($min < $events[$i]['date']) ? $events[$i]['date'] : $min;
        array_push($recent, $events[$i]['event']);
        array_push($recent_dates, $events[$i]['date']);
    }
    else
        array_push($today, $events[$i]['event']);
}

foreach($recent_dates as $key => $value){
    if($value != $min)
        unset($recent[$key]);
}

foreach($upcoming_dates as $key => $value){
    if($value != $max)
        unset($upcoming[$key]);
}

echo '<pre>';   
print_r($today);
print_r($upcoming);
print_r($recent);   

<强>结果

今天:

Array
(
    [0] => event4
    [1] => event5
)

即将来临:

Array
(
    [0] => event6
    [1] => event7
)

最近:

Array
(
    [1] => event2
    [2] => event3
)
  

注意:您使用的push_array不是PHP中的任何库函数。对于最近和即将推出的重新索引,您可以使用array_values

答案 2 :(得分:0)

另一个解决方案应该是

$recent = array();
$upcoming = array();
$today = array();
$all_dates = array();

foreach ($events as $event):
array_push($all_dates, $event['date']);
endforeach;

if ($key = array_search('2016-05-10', $all_dates)) {
  $prev_date = $all_dates[$key - 1];
}
for ($i = 0; $i < count($all_dates); $i++) {
if ($all_dates[$i] > $all_dates[$key]) {
    $next_date = $all_dates[$i + 1];
    break;
 }
}

for ($i = 0; $i < count($events); ++$i) {
if ($events[$i]['date'] == date('Y-m-d')) {
    array_push($today, $events[$i]['event']);
}
if ($events[$i]['date'] == $prev_date) {
    array_push($recent, $events[$i]['event']);
}
if ($events[$i]['date'] == $next_date) {
    array_push($upcoming, $events[$i]['event']);
 }
}

echo '<pre>';
print_r($upcoming);
print_r($today);
print_r($recent);

输出

Array
(
[0] => event6
[1] => event7
)

Array
(
[0] => event4
[1] => event5
)

Array
(
[0] => event2
[1] => event3
)