我将以下记录集存储在数组中:
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
答案 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");
}