在我的应用程序中,我有一组来自数据库的事件,每个事件都有一个start_time
和一个finish_time
。在当前版本的应用程序中,我在画布上绘制这些事件,每个事件都是具有特定样式的<div>
。
然而,我现在需要做同样的事情,但只显示用户空闲的时间(即没有事件的时间)。与事件相比,使用start_time
和finish_time
获得空闲时间块的阵列的最佳方式是什么?
假设$events按start_time对ASC排序,并且start_time>end_time不存在无效事件,那么事件在时间上也不会相交。
$events = array(
array('start_time', 'finish_time'),
array('start_time', 'finish_time'),
...
);
foreach($events as $key => $event) {
if(isset($events[$key+1]))
$free_time[] = array(
'start_time' => $event['finish_time'],
'end_time' => $events[$key+1]['start_time']
);
}
}
与Zuker的响应中的基本原理相同,但不依赖于使用"先前状态"变量的连续数组。
<?php
$result = array();
// *
$end = '00:00:00';
foreach( getData() as $d ) {
if ( $d['start_time']!=$end ) {
$result[] = array('name'=>'available', 'start_time'=>$end, 'finish_time'=>$d['start_time'] );
}
$end = $d['finish_time'];
$result[] = $d;
}
// *
$result[] = array('name'=>'available', 'start_time'=>$end, 'finish_time'=>'23:59:59' );
print_r($result);
function getData() {
return array(
array(
'name'=>'event A',
'start_time'=>'01:45:00',
'finish_time'=>'02:30:15'
),
array(
'name'=>'event B',
'start_time'=>'02:30:15',
'finish_time'=>'03:00:00'
),
array(
'name'=>'event C',
'start_time'=>'03:15:00',
'finish_time'=>'06:15:00'
),
);
}
打印
Array
(
[0] => Array
(
[name] => available
[start_time] => 00:00:00
[finish_time] => 01:45:00
)
[1] => Array
(
[name] => event A
[start_time] => 01:45:00
[finish_time] => 02:30:15
)
[2] => Array
(
[name] => event B
[start_time] => 02:30:15
[finish_time] => 03:00:00
)
[3] => Array
(
[name] => available
[start_time] => 03:00:00
[finish_time] => 03:15:00
)
[4] => Array
(
[name] => event C
[start_time] => 03:15:00
[finish_time] => 06:15:00
)
[5] => Array
(
[name] => available
[start_time] => 06:15:00
[finish_time] => 23:59:59
)
)
(*)这不包括前一天开始并在当天结束的事件,或当天开始并在第二天结束的事件。为了简洁起见,我省略了日期部分,但那些"边缘情况"应该是微不足道的。