
One of my follower send me this question in email, seeking my help to split a date array in to possible date ranges in PHP Laravel framework, and he want to get ranges based on consecutive day orders.
He has an array which contains a set of dates as in the example bellow.
$days =array (
'2018-10-15',
'2018-10-16',
'2018-10-17',
'2018-10-18',
'2018-10-19',
'2018-10-20',
'2018-10-21',
'2018-10-22',
'2018-10-23',
/* MISSING 2018-10-24 */
'2018-10-25',
'2018-10-26',
'2018-10-27',
'2018-10-28',
'2018-10-29',
'2018-10-30',
'2018-10-31',
'2018-11-01',
'2018-11-02',
/* MISSING 2018-11-03 */
'2018-11-04',
'2018-11-05',
'2018-11-06',
'2018-11-07',
'2018-11-08',
'2018-11-09',
'2018-11-10',
'2018-11-11',
'2018-11-12',
'2018-11-13',
'2018-11-14',
'2018-11-15',
'2018-11-16',
'2018-11-17',
'2018-11-18',
'2018-11-19',
'2018-11-20',
'2018-11-21',
'2018-11-22',
'2018-11-23',
'2018-11-24',
'2018-11-25',
'2018-11-26',
'2018-11-27',
'2018-11-28',
'2018-11-29',
'2018-11-30',
'2018-12-01',
'2018-12-02',
'2018-12-03',
'2018-12-04',
'2018-12-05',
'2018-12-06',
'2018-12-07',
'2018-12-08',
'2018-12-09',
'2018-12-10',
);before jump to write our solution, let looks at how our expected output should be for above set of dates,
$date_ranges = Array (
[0] => Array ( [0] => 2018-10-15 [1] => 2018-10-23 )
[1] => Array ( [0] => 2018-10-25 [1] => 2018-11-02 )
[2] => Array ( [0] => 2018-11-04 [1] => 2018-12-10 )
) Looking at the expected final out put,
we have 3 possible ranges from the set of dates , because "2018-10-24", "2018-11-03" are missing in the dates array, which breaks the consecutive order.
Here is the PHP function which I wrote as a helper function which expect date array argument and can bring the output as in the example above,
function getDateRangeSplitted($dates)
{
sort($dates);
$startDate = $dates[0];
$finishDate = array_pop($dates);
// walk through the dates, breaking at gaps
foreach ($dates as $key => $date)
if (($key > 0) && (strtotime($date)-strtotime($dates[$key-1]) > 99999)) {
$result[] = array($startDate,$dates[$key-1]);
$startDate = $date;
}
// force the end
$result[] = array($startDate,$finishDate);
return $result;
}
Be the first one to write a response :(
{{ reply.member.name }} - {{ reply.created_at_human_readable }}