fishmong3r
fishmong3r

Reputation: 1434

Find recent and upcoming dates

I have a two-dimensional array containing events and dates:

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

Let's say today is 2016-05-10 and I want to create 3 new arrays:

$recent - all events happened on the previous available day
$today - all events today
$upcoming - all events happening on the next available day

$today is easy:

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

So, I will need $recent to contain event2 and event3, and $upcoming to contain event6 and event7.

The question is how to find the recent and the upcoming ones.

*Clarification: I don't want all the events in $recent happened before today, but the events happened on the previous available day. So in this case only events happened on 2016-05-08

Upvotes: 2

Views: 44

Answers (3)

Bikash
Bikash

Reputation: 1938

Another solution should be

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

Output will be

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

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

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

Upvotes: 0

splash58
splash58

Reputation: 26153

// 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']);
    } 
}

Upvotes: 3

Murad Hasan
Murad Hasan

Reputation: 9583

Try with creating three (3) blank array, check the date is greater or less than today or not and push into array according to conditions.

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

Result

Today:

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

Upcoming:

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

Recent:

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

Note: You use push_array which is not any library function in PHP. For Re-index of recent and upcoming you can use array_values.

Upvotes: 1

Related Questions