参考我的原始帖子(PHP split data range to get only chunks free),我做了一些实现,以获得更好的结果,但在某些情况下仍然不正确。
我的目标是拆分原始范围日期,以仅获得未被活动占用的空闲块。
这是我在 php 中的实际脚本:
function date_compare($a, $b)
{
$t1 = strtotime($a['start']);
$t2 = strtotime($b['start']);
return $t1 - $t2;
}
$fullrange = array( // <----------------------------------- one month range to split
"start" => "2019-12-01 00:00:00",
"end" => "2019-12-31 23:59:59"
);
$result[] = $fullrange;
$array_activities = array( // <--------------------------- activities (busy ranges)
0 => array(
"start" => "2019-12-08 09:00:00",
"end" => "2019-12-08 10:00:00"
),
1 => array(
"start" => "2019-12-07 09:00:00",
"end" => "2019-12-07 17:40:00"
),
2 => array(
"start" => "2019-12-10 10:00:00",
"end" => "2019-12-15 17:00:00"
),
3 => array(
"start" => "2019-12-11 08:00:00",
"end" => "2019-12-17 21:00:00"
),
4 => array(
"start" => "2019-12-08 08:57:05",
"end" => "2019-12-08 19:00:00"
),
5 => array(
"start" => "2019-12-04 10:00:00",
"end" => "2019-12-05 17:00:00"
),
6 => array(
"start" => "2019-12-20 10:00:00",
"end" => "2019-12-31 23:59:59"
),
7 => array(
"start" => "2019-12-16 10:00:00",
"end" => "2019-12-31 23:59:59"
)
);
// reorder array of activities by date start
usort($array_activities, 'date_compare');
foreach ( $array_activities as $index_1 => $array_activity ) {
foreach ($result as $index_2 => $r) {
if ( $r['start'] < $array_activity['start'] && $array_activity['start'] < $r['end'] ) {
$temp = new Datetime($array_activity['start']);
$temp->modify("-1 second");
$result[$index_2]['end'] = $temp->format("Y-m-d H:i:s");
if ( $r['start'] < $array_activity['end'] && $array_activity['end'] < $r['end'] ) {
$result[] = array("start" => $array_activity['start'], "end" => $r['end']);
}
}
}
波斯汪
明月笑刀无情