给定一天中发生的事件列表,我将如何计算这些事件之间的差距


Given a list of events in a day, how would I calculate instead the gaps between those events?

在我的应用程序中,我有一组来自数据库的事件,每个事件都有一个start_time和一个finish_time。在当前版本的应用程序中,我在画布上绘制这些事件,每个事件都是具有特定样式的<div>

然而,我现在需要做同样的事情,但只显示用户空闲的时间(即没有事件的时间)。与事件相比,使用start_timefinish_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
        )
)

(*)这不包括前一天开始并在当天结束的事件,或当天开始并在第二天结束的事件。为了简洁起见,我省略了日期部分,但那些"边缘情况"应该是微不足道的。