做一个个人项目,只用 php 做一个日历。我根本想不出一种方法来根据相交日期对数组进行分组,以便我可以在网格上绘制它们。看起来像这样的东西
http://calendar.oregonstate.edu/docs/img/day_view_advanced.gif(还不能发布图片)
原始数组
array
0 =>
array (size=7)
'ID' => string '6188' (length=4)
'name' => string 'test' (length=32)
'dt_start' => string '2012-10-04 10:00:00' (length=19)
'dt_end' => string '2012-10-04 11:00:00' (length=19)
假设有几个事件的重叠日期最多。这是我用来检查日期是否相交并且有效的函数。
function Intersect ($date, $cDate, $start, $end) {
return ($date == $start) || ($date > $start ? $date <= $end : $start < $cDate);
}
我对实际绘图没有问题,但尝试对数组进行分组,以便将它们适当地放置在网格上。
//$e is the events
foreach ($e as $k => $a) {
$oStart1 = new DateTime( $a ['dt_start'] );
$oEnd1 = new DateTime( $a ['dt_end'] );
foreach ($e as $i => $b) {
if ( $a['ID'] == $b['ID'] )
continue;
$oStart2 = new DateTime( $b ['dt_start'] );
$oEnd2 = new DateTime( $b ['dt_end'] );
if ( Intersect ($oStart1, $oEnd1, $oStart2, $oEnd2) ) {
$intersect[$a['ID']] = $a;
}
}
}
这将所有相互交叉的日期分组。这一直让我发疯,因为我只是想不出一种方法将 $intersect 数组拆分为不同的组,以便我可以正确设置宽度。最好我希望得到的数组看起来像这样
$group[ 1 ] = array (
array (
'start_time' => '2012-10-04 10:00:00',
'end_time' => '2012-10-04 12:00:00'
),
array (
'start_time' => '2012-10-04 10:30:00',
'end_time' => '2012-10-04 11:40:00'
),
array (
'start_time' => '2012-10-04 11:00:00',
'end_time' => '2012-10-04 12:00:00'
)
);
$group[ 2 ] = array (
array (
'start_time' => '2012-10-04 13:00:00',
'end_time' => '2012-10-04 14:00:00'
),
array (
'start_time' => '2012-10-04 13:30:00',
'end_time' => '2012-10-04 13:40:00'
)
);
我知道有一个库可以做到这一点,即 jquery 完整日历插件非常好,但我正在尝试学习更多关于编程的知识。任何帮助或指向我正确方向的链接都会很棒。