【发布时间】:2016-03-24 13:03:59
【问题描述】:
我正在开发一项功能,用于检查外部事件是否与内部事件发生冲突(在日历应用中)。流程如下:
- 我的应用程序创建了一系列可能的事件(称为
$internalEvents) - 我从 Google 日历、iCloud 等日历(称为
$externalEvents)获取外部事件。这些是类型为busy的现有事件。 - 现在我必须检查内部和外部事件是否存在任何冲突。正如您在下面看到的那样,我尝试了一些方法,但这到目前为止还不是正确的或防弹的。
我试图将它尽可能地减少到最低限度。这是数据输入:
$internalEvents = array(
array(
"start" => "03/29/2016 12:00:00",
"end" => "03/29/2016 13:00:00"
),
array(
"start" => "03/29/2016 12:30:00",
"end" => "03/29/2016 13:30:00"
),
array(
"start" => "03/29/2016 13:00:00",
"end" => "03/29/2016 14:00:00"
),
array(
"start" => "03/29/2016 13:30:00",
"end" => "03/29/2016 14:50:00"
),
array(
"start" => "03/29/2016 14:00:00",
"end" => "03/29/2016 15:00:00"
),
array(
"start" => "03/29/2016 14:30:00",
"end" => "03/29/2016 15:30:00"
),
array(
"start" => "03/29/2016 15:00:00",
"end" => "03/29/2016 16:00:00"
),
array(
"start" => "03/29/2016 15:30:00",
"end" => "03/29/2016 16:30:00"
),
array(
"start" => "03/29/2016 16:00:00",
"end" => "03/29/2016 17:00:00"
)
);
$externalEvents = array(
array(
"start" => "03/29/2016 08:00:00",
"end" => "03/29/2016 12:00:00",
"type" => "busy"
),
array(
"start" => "03/29/2016 15:30:00",
"end" => "03/29/2016 16:00:00",
"type" => "busy"
),
array(
"start" => "03/29/2016 13:30:00",
"end" => "03/29/2016 14:15:00",
"type" => "busy"
)
);
现在我尝试通过比较内部事件和所有外部事件来找出任何类型的冲突:
foreach($internalEvents as $internalEvent) {
$internalEventStart = new DateTime($internalEvent['start']);
$internalEventEnd = new DateTime($internalEvent['end']);
$result = true;
echo "\nverifying " . $internalEventStart->format('Y-m-d H:i') . " - " . $internalEventEnd->format('Y-m-d H:i') . "\n";
foreach($externalEvents as $externalEvent) {
$externalEventStart = new DateTime($externalEvent['start']);
$externalEventEnd = new DateTime($externalEvent['end']);
// check if there are conflicts between internal and external events
if ($internalEventStart >= $externalEventStart && $internalEventStart <= $externalEventEnd) {
$result = false;
echo " problem 1: event is between busy time: " . "\n";
}
if ($internalEventStart >= $externalEventStart && $internalEventStart <= $externalEventEnd && $externalEventEnd <= $internalEventEnd) {
$result = false;
echo " problem 2: event starts during busy time: " . "\n";
}
if ($internalEventStart <= $externalEventStart && $externalEventStart <= $internalEventEnd && $internalEventEnd <= $externalEventEnd) {
$result = false;
echo " problem 3: event stops during busy time: " . "\n";
}
if (($internalEventStart <= $externalEventStart) && ($externalEventStart <= $externalEventEnd) && ($externalEventEnd <= $internalEventEnd)) {
$result = false;
echo " problem 4: event during busy time: " . "\n";
}
if (($internalEventStart <= $internalEventEnd) && ($internalEventEnd <= $externalEventStart) && ($externalEventStart <= $externalEventEnd)) {
$result = false;
echo " problem 5: event during busy time: " . "\n";
}
}
if($result) {
echo " result: OK\n";
} else {
echo " result: NOT OK \n";
}
}
我正在寻找一种可以发现任何可能的事件重叠冲突的算法。任何提示都非常感谢。
运行代码可以在here(IDEone.com)找到。
【问题讨论】:
-
您的实际代码有效吗?我已经增加了输出时间,这对我来说似乎不连贯。检查我在这个pastebin 上的结果:我用
≈模棱两可的结果和≠标记了不正确的结果。相反,如果结果正确,您能否更好地解释碰撞标准?我打算如果有重叠就会发生碰撞......让我知道。 -
@fusion3k 它曾经使用一组事件,但是当我更改事件时,我意识到它实际上不起作用。这就是我需要社区帮助的原因。您的发现似乎是正确的。