外部イベントが内部イベント(カレンダーアプリ)と衝突するかどうかをチェックする機能を開発中です。プロセスは次のようになります。PHPを使用してカレンダーイベントのオーバーラップの競合を検出しました
- 私のアプリケーションは(
$externalEvents
と呼ばれる)($internalEvents
と呼ばれる)可能性のあるイベントなど、Googleカレンダー、iCloudの、などのカレンダーから - Iソース外部イベントの配列を作成します。これらは、タイプ
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](http://pastebin.com/LHiFMz9z)の私の結果をチェックしてください:私は曖昧な結果を「≈」とマークし、「≠」は正しい結果を表示していません。代わりに、結果が正しい場合は、衝突基準をよりよく説明できますか?私は重複している場合は衝突があることを意図した...私に教えてください。 – fusion3k
@ fusion3kこれは以前は一連のイベントで作業していましたが、イベントを変更したときには実際には機能しないと認識しました。だからこそ私はコミュニティの助けが必要です。あなたの発見は正しいようです。 – doonot