私は最近、日付の衝突の問題にたくさん対処しなければなりませんでした、そして私が思いついた最高のものは次のとおりです:
date1.start<date2.endおよびdate1.end>date2.start=衝突
この単純な式は、次のすべての状況を説明します。
-すべての状況で同じ:
date1.start=2009年1月1日
date1.end=2009年1月10日
-開始日は最初の日付範囲にあります:
date2.start=2009年1月9日
date2.end=2009年2月10日
-終了日は最初の日付範囲にあります:
date2.start=2008年12月10日
date2.end=2009年1月3日
-開始日と終了日が最初の日付範囲内にあります:
date2.start=2009年1月2日
date2.end=2009年1月3日
--最初の日付が2番目の日付の範囲内にあります:
date2.start=2008年12月1日
date2.end=2009年2月1日
$date1 = array('start' => '2009-01-05', 'end' => '2009-01-10');
$date2 = array('start' => '2009-01-01', 'end' => '2009-01-04'); // end inside one
$date3 = array('start' => '2009-01-04', 'end' => '2009-01-15'); // start inside one
$date4 = array('start' => '2009-01-01', 'end' => '2009-01-15'); // one inside me
$date5 = array('start' => '2009-01-04', 'end' => '2009-01-05'); // inside one
function datesCollide($date1, $date2)
{
$start1TS = strtotime($date1['start']);
$end1TS = strtotime($date1['end']);
$start2TS = strtotime($date2['start']);
$end2TS = strtotime($date2['end']);
if ($start1TS <= $end2TS && $end1TS >= $start2)
{
return true;
}
return false;
}
あなたのコメントに基づいて、これはおそらくあなたが探している解決策です:この解決策はあまり最適化されておらず、より良い解決策を見つけるためにのみ使用されるべきであることに注意してください。 Webからのコードを絶対に信用しないでください。
$events = array(
array(
"id" => 21,
"start" => 1242219600,
"end" => 1242237600,
"title" => "foo",
"split" => false
),
array(
"id" => 22,
"start" => 1242223200,
"end" => 1242234000,
"title" => "foo",
"split" => false
)
);
foreach ($events as $key => $event)
{
$events[$key]->split = dateCollisionCheck($event, $events);
}
function dateCollisionCheck(&$event, &$eventList)
{
foreach ($eventList as $checkEvent)
{
if ($event->id != $checkEvent->id)
{
if ($event->start <= $checkEvent->end && $event->end >= $checkEvent->start)
{
return true; // return as soon as we know there is a collision
}
}
}
return false;
}
*コードはテストされていません