I’ve got an array like the following :
JavaScript
x
$array1 = [
[
"start_datetime" => "2021-08-10 12:05:00" ----> These are the initial intervals
"end_datetime" => "2021-08-10 14:20:00" ----> that I would like to separate
],
[
"start_datetime" => "2021-08-10 14:45:00"
"end_datetime" => "2021-08-10 18:55:00"
],
[
"start_datetime" => "2021-08-10 19:25:00"
"end_datetime" => "2021-08-10 21:00:00"
],
]
And another array :
JavaScript
$array2 = [
[
"start_datetime" => "2021-08-10 12:35:00" ----> These are the intervals to
"end_datetime" => "2021-08-10 13:35:00" ----> remove from the array
],
]
I would like to create a new $array3
that removes the intervals from $array2
in $array1
to give the following result :
JavaScript
$array3 = [
[
"start_datetime" => "2021-08-10 12:05:00" ----> As you can see, these new array
"end_datetime" => "2021-08-10 12:35:00" ----> entries were added to remove
],
[
"start_datetime" => "2021-08-10 13:35:00" ----> the interval in $array2 which
"end_datetime" => "2021-08-10 14:20:00" ----> are from 12:35 to 13:35
],
[
"start_datetime" => "2021-08-10 14:45:00"
"end_datetime" => "2021-08-10 18:55:00"
],
[
"start_datetime" => "2021-08-10 19:25:00"
"end_datetime" => "2021-08-10 21:00:00"
],
]
As you can see, in $array3
2 new entries were added to remove the interval used in $array2
. I don’t know how can I tackle an algorithm to do this. Any help, advice or resources is appreciated.
Note that, in $array1
there will never be 2 same intervals, intervals are unique.
Advertisement
Answer
Here it is
JavaScript
function IndexOfPeriodToBrake($startRangeStr, $endRangeStr, $arr) {
$start = strtotime($startRangeStr);
$end = strtotime($endRangeStr);
foreach($arr as $idx => $period) {
$startP = strtotime($period['start_datetime']);
$endP = strtotime($period['end_datetime']);
if (($startP < $start)&&($endP > $end)) {
return $idx;
}
}
return false;
}
function checkOneRange(&$array, $startRangeStr, $endRangeStr) {
$idxFound = IndexOfPeriodToBrake($startRangeStr, $endRangeStr, $array);
if ($idxFound !== false) {
$oldStartStr = $array[$idxFound]['start_datetime'];
$oldEndStr = $array[$idxFound]['end_datetime'];
$idx = -1;
foreach ($array as $period) {
$idx++;
if ($idx === $idxFound) {
$array[$idx] = ['start_datetime' => $oldStartStr, 'end_datetime' => $startRangeStr];
$idx++;
$array[$idx] = ['start_datetime' => $endRangeStr, 'end_datetime' => $oldEndStr];
} else {
$array[$idx] = $period;
}
}
}
}
$array3 = $array1;
foreach ($array2 as $range) {
$startRangeStr = $range['start_datetime'];
$endRangeStr = $range['end_datetime'];
checkOneRange($array3, $startRangeStr, $endRangeStr);
}