php中的多时间交叉
我现在的处境是我无法控制的。多次时间重叠。我在两个网站上看到过很多帖子,但没有一篇是多次重叠的 以下是我想输入的数据:php中的多时间交叉,php,time,overlapping,Php,Time,Overlapping,我现在的处境是我无法控制的。多次时间重叠。我在两个网站上看到过很多帖子,但没有一篇是多次重叠的 以下是我想输入的数据: <?php //RUN EACH Class Selection for Monday foreach($class as $Classes){ $time[] = array($ClassStartTime, $ClassEndTime, $classID); } OverLapFunction($time); ?> 然后发布classID和重叠量
<?php
//RUN EACH Class Selection for Monday
foreach($class as $Classes){
$time[] = array($ClassStartTime, $ClassEndTime, $classID);
}
OverLapFunction($time);
?>
然后发布classID和重叠量。以前有人遇到过这种情况吗?或者想出了如何做到这一点?免责声明:此函数更多的是伪代码,您需要自己实现它;它返回重叠类的组。我这样写是为了让你更好地理解它。如果您需要更多解释为什么我们需要先对时间进行排序,请告诉我
function OverLapFunction($time) {
sort_by_start_time($time); // ensures that we don't have
// overlapping groups at the end
$groups = array(); // groups have starting time, ending
// time and items they contain
foreach($time as $item) {
// if we don't find a group to put this item in, we create a new one
$found = false;
foreach($groups as $group) {
// basically the whole if statement looks for overlapping between
// the group and the current item
if(($item['start_time'] >= $group['start_time']
&& $item['start_time'] <= $group['end_time']) ||
($item['end_time'] >= $group['start_time']
&& $item['end_time'] <= $group['end_time']))
$group['items'][] = $item; // add the item to its group
$found = true;
break;
}
if(!$found) { // no group that fits this item; create a new one
$groups[] = array(
'start_time' => $item['start_time'], // start and end times
'end_time' => $item['end_time'], // are the item's
'items' => array($item),
);
}
}
return $groups;
}
函数重叠函数($time){
按开始时间排序($time);//确保我们没有
//末尾重叠的组
$groups=array();//组有开始时间,结束时间
//时间及其包含的项目
foreach($time作为$item){
//如果找不到要将此项目放入的组,我们将创建一个新组
$found=false;
foreach($组作为$组){
//基本上,整个if语句都在寻找
//组和当前项
如果($item['start\u time']>=$group['start\u time']
&&$item['start\u time']=$group['start\u time']
&&$item['end_time']$item['start_time'],//开始和结束时间
'end_time'=>$item['end_time'],//是项的
'items'=>数组($item),
);
}
}
返回$groups;
}
哦,作为记录:如果您有一个用户选择了一些类,并且您需要确保他选择的类中没有两个重叠,那么您可以将问题简化为您已经掌握的问题:
for($i=0; $i<count($item); $i++) {
for($j=0; $j<count($item); $j++) {
if($i == $j) {
continue;
}
if(times_overlap($item[$i], $item[$j])) {
do_something(); // the user has chosen incorrect classes
}
}
}
对于($i=0;$i说您的数据如下:
$classes = array(
array(
'name' => 'A',
'day' => 'Monday',
'start'=> '08:00AM',
'end' => '11:00AM',
),
array(
'name' => 'B',
'day' => 'Monday',
'start'=> '10:00AM',
'end' => '11:30AM',
),
array(
'name' => 'C',
'day' => 'Monday',
'start'=> '12:00PM',
'end' => '04:00PM',
),
array(
'name' => 'D',
'day' => 'Monday',
'start'=> '03:00PM',
'end' => '06:00PM',
),
);
$overlap = array();
foreach ($classes as $class1) {
foreach ($classes as $class2) {
if ($class1['day'] != $class2['day'] || $class1 == $class2) continue;
if (strtotime($class1['start']) < strtotime($class2['end']) &&
strtotime($class1['start']) >= strtotime($class2['start']))
{
$array = array($class1['name'], $class2['name']);
sort($array);
if (!in_array($array, $overlap)) $overlap[] = $array;
}
}
}
您只需要一个嵌套的foreach
,如下所示:
$classes = array(
array(
'name' => 'A',
'day' => 'Monday',
'start'=> '08:00AM',
'end' => '11:00AM',
),
array(
'name' => 'B',
'day' => 'Monday',
'start'=> '10:00AM',
'end' => '11:30AM',
),
array(
'name' => 'C',
'day' => 'Monday',
'start'=> '12:00PM',
'end' => '04:00PM',
),
array(
'name' => 'D',
'day' => 'Monday',
'start'=> '03:00PM',
'end' => '06:00PM',
),
);
$overlap = array();
foreach ($classes as $class1) {
foreach ($classes as $class2) {
if ($class1['day'] != $class2['day'] || $class1 == $class2) continue;
if (strtotime($class1['start']) < strtotime($class2['end']) &&
strtotime($class1['start']) >= strtotime($class2['start']))
{
$array = array($class1['name'], $class2['name']);
sort($array);
if (!in_array($array, $overlap)) $overlap[] = $array;
}
}
}
如果您要将D类更改为:
array(
'name' => 'D',
'day' => 'Monday',
'start'=> '10:00AM',
'end' => '03:00PM',
),
…有效地重叠所有类,您将得到:
Array
(
[0] => Array
(
[0] => A
[1] => B
)
[1] => Array
(
[0] => B
[1] => D
)
[2] => Array
(
[0] => C
[1] => D
)
[3] => Array
(
[0] => A
[1] => D
)
)
我仍然不明白你想从OverlappFunction
中得到什么。你需要知道是否所有日期在某个点重叠,或者它们覆盖了一个连续的时间范围,你想知道最多类相交的时间点吗?也许你可以找到本文的第一部分。假设我有:a类:周一:8:00AM-11:00AM&&B类:星期一:上午10:00-晚上11:30&&C类:星期一:下午12:00-下午4:00&&D类:星期一:下午3:00-下午6:00,然后我希望Overlapple函数输出类A和类B重叠以及类C和类D重叠。Ps。我的所有内容都是db。不确定这是否有助于逻辑。我正在尝试抛出错误当用户选择时间重叠的课程时。时间是什么格式的?Unix TS?YYYY-MM-DD HH:II:SS?这非常有效,谢谢。我还有一个问题……如果校园不同,我必须在课程之间留出1小时的时差,这是否容易实现?@Jsu:理论上,做
在如果
应该有用。了不起的网络编码员,你帮我省去了巨大的头痛和最后期限。干杯。