Скажите, что ваши данные таковы:
$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
время начала меньше $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
)
)