データが次のようになっているとします。
$classes = array(
array(
'name' => 'A',
'day' => 'Monday',
'start'=> '08:00AM',
'end' => '11:00AM',
),
array(
'name' => 'B',
'day' => 'Monday',
'start'=> '10:00AM',
'end' => '11:30AM',
),
array(
'name' => 'C',
'day' => 'Monday',
'start'=> '12:00PM',
'end' => '04:00PM',
),
array(
'name' => 'D',
'day' => 'Monday',
'start'=> '03:00PM',
'end' => '06:00PM',
),
);
foreach
次のように、ネストされた が必要です。
$overlap = array();
foreach ($classes as $class1) {
foreach ($classes as $class2) {
if ($class1['day'] != $class2['day'] || $class1 == $class2) continue;
if (strtotime($class1['start']) < strtotime($class2['end']) &&
strtotime($class1['start']) >= strtotime($class2['start']))
{
$array = array($class1['name'], $class2['name']);
sort($array);
if (!in_array($array, $overlap)) $overlap[] = $array;
}
}
}
基本的に、各クラスをすべてのクラスと比較します。開始時刻が終了時刻$class1
よりも短く、開始時刻が開始時刻よりも長い場合: オーバーラップします。各クラスは互いに 2 回比較されることに注意してください (例: A から B、B から A)。最初のパスで一致しない場合は、2 番目のパスで一致します。$class2
$class1
$class2
これにより、次のことが得られます。
Array
(
[0] => Array
(
[0] => B
[1] => A
)
[1] => Array
(
[0] => D
[1] => C
)
)
クラスを次のように変更する場合D
:
array(
'name' => 'D',
'day' => 'Monday',
'start'=> '10:00AM',
'end' => '03:00PM',
),
...効果的にすべてのクラスをオーバーラップすると、次のようになります。
Array
(
[0] => Array
(
[0] => A
[1] => B
)
[1] => Array
(
[0] => B
[1] => D
)
[2] => Array
(
[0] => C
[1] => D
)
[3] => Array
(
[0] => A
[1] => D
)
)