用于拆分结果集并按日期显示的例程

时间:2014-04-22 01:16:27

标签: php

我将以下记录集存储在数组中:

id    start                end
0     2014-04-22 8:00:00   2014-04-22 22:00:59
1     2014-04-22 22:01:00  2014-04-22 23:00:59
2     2014-04-22 23:01:00  2014-04-24 10:00:00

该数组具有以下结构

$array[] = array('id'     => id from the recordset,
                 'start'  => start date from the recordset,
                 'end'    => end date from the recordset);

我需要像这样显示它

Date      ID       Start     End
22/04/14  0        08:00:00  22:00:59
22/04/14  1        22:01:00  23:00:59
22/04/14  2        23:01:00  23:59:59
23/04/14  2        00:00:00  23:59:59
24/04/14  2        00:00:01  10:00:00

这意味着: 1)如果有一个或多个作业在一天内完成,则将每个作业连续放置。 2)如果作业的结束日期大于DATE的当前值,请将行放在END列23:59:59中,然后开始新行在新行中使用相同的ID

我设法(使用while循环)设置"行"对于每一天(从2014年4月22日到2014年4月24日)并将工作的开始日期与循环的当前日期相匹配,但我无法找到通往&#34的方式;传播"这项工作超过一天。

$date = mktime(0,0,0,04,22,2014);
while ($loopDate < $date*(3*86400)){
   for($i=0;$i<count($array);$i++){
      if($array[$i]['end']<$loopDate && $array[$i]['start']){
        echo $loopDate.", ".$array[$i]['id'].", ".$array[$i]['start'].", ".$array[$i]['end'];
      }
   }
}

提前致谢。 Luis M. Valenzuela

1 个答案:

答案 0 :(得分:0)

$recordset = array(
    array(
        'id'     => 0,
        'start'  => '2014-04-22 8:00:00',
        'end'    => '2014-04-22 22:00:59'
    ),
    array(
        'id'     => 1,
        'start'  => '2014-04-22 22:01:00',
        'end'    => '2014-04-22 23:00:59'
    ), 
    array(
        'id'     => 2,
        'start'  => '2014-04-22 23:01:00',
        'end'    => '2014-04-24 10:00:00'
    ),
);

foreach ($recordset as $record) {
    $start = DateTime::createFromFormat('Y-m-d G:i:s', $record['start']); 
    $end   = DateTime::createFromFormat('Y-m-d G:i:s', $record['end']);
    if ($start->format('Y-m-d') != $end->format('Y-m-d')) {
        $diff = $start->diff($end);
        $pad  = ($start->format('His') > $end->format('His')) ? 2 : 1;
        $days = $diff->d + $pad;

        $date      = $start->format('d/m/y');
        $id        = $record['id'];
        $starttime = $start->format('H:i:s');
        $endtime   = '23:59:59';
        outputRecord($date, $id, $starttime, $endtime);

        for ($i = 2; $i <= $days; $i++) {
            $starttime = '00:00:01';
            $endtime   = ($i == $days) ? $end->format('H:i:s') : '23:59:59';
            outputRecord($date, $id, $starttime, $endtime);
        }        
    }
    else {
        outputRecord(
            $start->format('d/m/y'),
            $record['id'],
            $start->format('H:i:s'),
            $end->format('H:i:s')
        );
    }
}

function outputRecord($date, $id, $start, $end) {
    printf("%s %u %s %s%s", $date, $id, $start, $end, "<br>\n");
}

Demo