我正在工作一个空闲日期时隙。我一直坚持创建适当的spilts数组并显示可用的时隙。
我想从开始时间和结束时间投入2小时时段。
foreach ( $period as $dt ){
$m = [
'start'=>date('Y-m-d ',strtotime($dt->format('Y-m-d').' -1
day')).$max,
'end'=>$dt->format('Y-m-d ').$min
];
foreach($free as $k=>$f){
if($m['start']>$f['start'] && $m['start']<=$f['end']){
$free[$k]['end'] = $m['start'];
if($m['end']<$f['end'])
$free[] = ['start'=>$m['end'], 'end'=>$f['end']];
}
elseif($m['end']<$f['end'] && $m['end']>$f['start']){
$free[$k]['start'] = $m['end'];
}
}
}
例如,上面的会议时间数组应产生以下空闲时间数组:
Array
(
[0] => Array
(
[start] => 2019-05-08 07:00:00
[end] => 2019-05-08 17:00:00
)
[1] => Array
(
[start] => 2019-05-09 11:25:00
[end] => 2019-05-09 12:40:00
)
[2] => Array
(
[start] => 2019-05-09 14:15:00
[end] => 2019-05-09 14:30:00
)
[3] => Array
(
[start] => 2019-05-10 07:00:00
[end] => 2019-05-10 17:00:00
)
[4] => Array
(
[start] => 2019-05-09 07:00:00
[end] => 2019-05-09 07:40:00
)
[5] => Array
(
[start] => 2019-05-11 07:00:00
[end] => 2019-05-11 17:00:00
)
)
预期输出:
Array
(
[0] => Array
(
[0] => Array(
[start] => 2019-05-08 07:00:00
[end] => 2019-05-08 09:00:00
)
[1] => Array(
[start] => 2019-05-08 09:00:00
[end] => 2019-05-08 11:00:00
)
[2] => Array(
[start] => 2019-05-08 11:00:00
[end] => 2019-05-08 13:00:00
)
[3] => Array(
[start] => 2019-05-08 13:00:00
[end] => 2019-05-08 15:00:00
)
[4] => Array(
[start] => 2019-05-08 15:00:00
[end] => 2019-05-08 17:00:00
)
)
[1] => Array
(
[start] => 2019-05-09 11:25:00
[end] => 2019-05-09 12:40:00
)
..等等...
答案 0 :(得分:0)
您可以这样处理
foreach($arr as $k => $v){
$diff = strtotime($v['end'])-strtotime($v['start']);
if($diff >= 7200){
for($i=strtotime($v['start']);$i<strtotime($v['end']);){
$start = date('Y-m-d H:i:s',$i);
$i = $i+7200;
$end = date('Y-m-d H:i:s',$i);
$res[$k][] = [
'start' => $start,
'end' => $end
];
}
}else{
$res[$k][] = [
'start' => date('Y-m-d H:i:s',strtotime($v['start'])),
'end' => date('Y-m-d H:i:s',strtotime($v['end']))
];
}
}
答案 1 :(得分:0)
我建议使用\ DateTime,使用起来很舒服
<?php
$start = new \DateTime('2019-05-08 07:00:00');
$end = new \DateTime('2019-05-08 07:30:00');
function getSlots(\DateTime $start, \DateTime $end): array
{
$slots = [];
while ($start < $end) {
$old = clone($start);
$start->modify('+2 hours');
if ($start > $end) {
echo 1;
$slots[] = [
'from' => $old,
'to' => $end
];
return $slots;
} else {
$slots[] = [
'from' => $old,
'to' => clone($start)
];
}
}
return $slots;
}
var_dump(getSlots($start, $end));
您可以在那里https://3v4l.org/qAatj
进行尝试