【问题标题】:How can I check for time span conflicts on each day?如何检查每天的时间跨度冲突?
【发布时间】:2018-01-07 03:15:18
【问题描述】:

A类时间:

Day 1 => 08:00-09:00 | 11:00-12:00 | 13:00-15:00 | 20:00-21:00
Day 2 => 12:00-13:00 | 14:00-15:00 
Day 3 => 08:00-09:00 | 16:00-17:00 | 18:00-19:00
Day 4 => 10:00-11:00 | 12:00-14:00 | 14:00-16:00
Day 5 => 08:00-10:00 | 13:00-15:00
Day 6 => 80:00-09:00 | 10:00-11:00

B类时间:

Day 1 => 10:00-11:00 | 17:00-19:00
Day 2 => 08:00-09:00 | 11:00-12:00
Day 3 => 08:00-09:00 | 17:00-18:00 | 20:00-21:00
Day 4 => 08:00-09:00 | 14:00-16:00 | 17:00-18:00
Day 5 => 08:00-10:00 | 14:00-15:00
Day 6 => 10:00-11:00

如何查看两课时间冲突

【问题讨论】:

  • 您的问题不清楚,请提供更多/更好的关于您的意图的详细信息。给定输入数组,您的预期结果是什么?
  • 会说还不清楚。您是否期望评估$stime1[0] > $stime2[0]?或者您是否希望将所有时间相加(例如 08:00 + 11:00 = 19:00,等等)然后比较它们? ......你如何给出你想要的结果,起点(你有,所以把它留在那里)然后向我们展示你是如何/尝试了什么来实现结果的?这将有助于我们乐于助人的灵魂;)
  • @InformationArtist 我并没有被您原始帖子的复杂性吓倒,我只是想更清楚地了解您想要的结果。我不是快速发帖​​者,我喜欢具有挑战性的问题。这是一个有一些相似之处的答案:stackoverflow.com/a/45156381/2943403 现在,给定您的两批不同的输入数据,您对每批的预期结果是什么?
  • A班时间:第1天08:00-09:00 | 13:00-15:00 | 20:00-21:00 第二天 12:00-13:00 | 14:00-15:00 第三天 08-09 | 16:00-17:00 | 18:00-19:00 第四天 10:00-11:00 | 12:00-14:00 | 14:00-16:00 第五天 08:00-10:00 | 13:00-15:00 第5天09:00-11:00 B类时间:第1天10:00-11:00 | 17:00-19:00 第二天 08:00-09:00 | 11:00-12:00 第三天 08:00-09:00 | 17-18 | 20-21 第四天 08:00-09:00 | 14:00-16:00 | 17:00-18:00 第五天 08:00-10:00 | 14:00-15:00 Day 5 10:00-11:00 @mickmackusa 如何查看两个类多时间冲突
  • 对不起,我今天没时间了,明天我会努力发布一些东西。所以冲突是:第 3 天:8-9 和第 5 天和第 6 天 10-11 的两个班级。我确信我可以解决一些问题。 (附注:第 6 天 A 类的拼写错误——但我知道你的意思不是 80 百小时)。

标签: php if-statement multidimensional-array time overlapping-matches


【解决方案1】:

因为重叠时段可能不是简单的== 比较,所以类时段必须分成开始和结束块并单独处理。不幸的是,这会产生大量循环的代码块——但这是不可避免的。

array_walk_recursive() 用于准备输入数据。根据设计,该函数仅迭代 $sched 的“叶节点”——这意味着 $v 永远不会是一个数组,它总是一个时间跨度的字符串。该功能也是“深度无知”,因此正确修改原始$sched数据的唯一方法是通过引用使$v可修改(参见:&$v)。

一旦数据被重组,就到了循环的时候了。一系列 3 个连续循环遍历“目标”类和天子数组以进行比较。另外 2 个循环用于访问所有其他类的相同 Day 子数组(句点)。较早的代码构建再次实现array_walk_recursive() 以减少总循环,但这不是最佳实践,因为使用带有break(2) 的提前退出的foreach 循环可以节省迭代并提高效率。

假设某些类可能没有带句点的一天,我已经进行了一天检查,以确保我的方法不会基于缺少的 Day 子数组导致通知/警告。

代码:(Demo)

$sched=[
    'Class A'=>[
        'Day 1'=>['10:00-11:00','11:00-12:00','13:00-15:00','20:00-21:00'],
        'Day 2'=>['12:00-13:00','14:00-15:00'],
        'Day 3'=>['08:00-09:00','16:00-17:00','18:00-19:00'],
        'Day 4'=>['10:00-11:00','12:00-14:00','14:00-16:00'],
        'Day 5'=>['08:00-10:00','13:00-15:00'],
        'Day 6'=>['08:00-09:00','10:00-11:00']
    ],
    'Class B'=>[
        'Day 1'=>['09:30-10:30','17:00-19:00'],
        'Day 2'=>['08:00-09:00','11:00-12:00'],
        'Day 3'=>['08:00-09:00','17:00-18:00','20:00-21:00'],
        'Day 4'=>['08:00-09:00','14:00-16:00','17:00-18:00'],
        'Day 5'=>['08:00-10:00','14:00-15:00'],
        'Day 6'=>['10:00-11:00']
    ],
    'Class C'=>[
        'Day 1'=>['12:00-14:00']
    ]
];
// Preparation: Split the dashed time spans into chunked subarrays containing start and end times
// e.g. $sched['Class A']['Day 1'][['10:00','11:00'],['17:00','19:00']]
array_walk_recursive($sched,function(&$v){$v=explode('-',$v);});

// Comparisons:
foreach($sched as $class=>$days){
    $other_classes=array_diff_key($sched,[$class=>'']);  // same array without target class
    foreach($days as $day=>$spans){
        //echo "\n\n$class, $day";
        foreach($spans as $period=>$span){
            //echo "\nchecking {$span[0]} & {$span[1]}";
            foreach($other_classes as $other_class=>$other_days){
                if(isset($other_days[$day])){  // this avoids Notices/Warning about non-existent day in class
                    foreach($other_days[$day] as $other_period=>$other_span){  // compare other classes on same day
                        //echo "\nversus {$other_span[0]} & {$other_span[1]}";
                        if(($span[0]>=$other_span[0] && $span[0]<$other_span[1]) || ($span[1]<=$other_span[1] && $span[1]>$other_span[0])){
                            $result[]="Clash: $class,$day#".++$period.": {$span[0]}-{$span[1]} vs $other_class,$day#".++$other_period.": {$other_span[0]}-{$other_span[1]}";
                            break(2);  // no need to further check this $span for clashes
                        }
                    }
                }
            }
        }
    }
}
echo implode("\n",$result);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    相关资源
    最近更新 更多