php对比时间冲突,获取存在交集和子集算法
有n个直播课程,其中有不同数量的场次,判断不同直播课场次下发生时间上交叉或者包含的,如何处理效率更快?其中,场次个数多个,直播课程多个。
最后变成的数组为 冲突的在上面,不冲突的场次在下面
原始数据:
$res=['直播课程A'=>[
'直播课程A_场次1'=>[
'startTime'=> '2020-06-01 19:20:00',
'endTime' => '2020-06-01 19:40:00'
],
'直播课程A_场次2'=>[
'startTime'=> '2020-06-02 19:20:00',
'endTime' => '2020-06-02 19:40:00'
],
],
'直播课程B'=>[
'直播课程B_场次1'=>[
'startTime'=> '2020-06-01 19:21:00',
'endTime' => '2020-06-01 19:39:00'
],
'直播课程B_场次2'=>[
'startTime'=> '2020-06-02 19:20:00',
'endTime' => '2020-06-02 19:40:00'
],
],
'直播课程C'=>[
'直播课程C_场次1'=>[
'startTime'=> '2020-06-01 19:19:00',
'endTime' => '2020-06-01 19:45:00'
],
'直播课程C_场次2'=>[
'startTime'=> '2020-06-02 19:20:00',
'endTime' => '2020-06-02 20:40:00'
],
],
'直播课程D'=>[
'直播课程D_场次1'=>[
'startTime'=> '2020-06-01 18:20:00',
'endTime' => '2020-06-01 19:20:00'
],
'直播课程D_场次2'=>[
'startTime'=> '2020-06-02 18:20:00',
'endTime' => '2020-06-02 19:39:00'
],
],
];
回答
感觉你这个问题没有描述清楚,比如 直播课程C_场次2和直播课程D_场次2就是冲突的,你这里却当做不冲突。
下面是我的找出冲突课程的代码,不冲突的你自己处理一下
$temp =[];foreach($res as $val){
$temp = array_merge($temp, $val);
}
uasort($temp, function($a, $b){
if($a['startTime']==$b['startTime']){
return ($a['endTime']<=$b['endTime'])?-1:1;
}
return ($a['startTime'] < $b['startTime']) ? -1 : 1;
}
);
$conflict = [];
$i = 0;
foreach($temp as $key=>$item){
$i++;
$compare = array_slice($temp, $i);
foreach($compare as $k=>$v){
if($v['startTime']>=$item['endTime']){
continue 2;
}
if(empty($conflict)){
$conflict[$key]=[$key=>$item, $k=>$v];
}else{
$conflict[$key][$k]=$v;
}
}
}
var_dump($conflict);
以上是 php对比时间冲突,获取存在交集和子集算法 的全部内容, 来源链接: utcz.com/a/32254.html