如何检查与多个日期时间范围的冲突

How to check for conflict with multiple datetime RANGES

我对如何检查多个 *date/time 值-范围-(意思是:开始 结束时间)是否与彼此。

我需要处理的数据摘要和样本。

我有一个(应用程序)事件 table,用于创建一个表单供用户浏览并勾选(复选框)他们参加的所有 sessions/events。

复选框的名称是使用有关会话的信息生成的。 (month/day start/end 次以及会话 ID)

即:hours_9_5_p02_800_845

9 = month
5 = date
p02 = session id/event code
800 = start time
845 = end time

全部由下划线 ("_") 分隔

如果用户检查(并提交)多个会话,将有许多这样的值来检查时间冲突..

hours_9_5_p08_755_800
hours_9_5_p02_800_845
hours_9_5_p02_800_855
hours_9_5_p03_800_845
hours_9_5_p04_820_835
hours_9_5_p04_845_900
hours_9_5_REG_900_915
hours_9_5_REG_1300_1305
hours_9_5_REG_1310_1335
hours_9_5_REG_1320_1335

以上是我 'could' 作为用户 selection/submission 获得的 fieldlist/array 的示例,我需要检查是否存在任何可能的冲突(显然用户不能是两个地方一次) :) 以上 many/several 重叠选择了完全相同的时隙。

** 我愿意接受 PHP,(在用户提交后检查)或 javascript/jQuery(如果它可以进行 date/time RANGE 冲突检查,它可能会更容易如果在前端完成,则在页面上突出显示那些 rows/elements)

我想,首先你需要从字段列表数组中解析那些复选框names/strings...

我是这样做的:(php)

function conflictParse($delimiter, $targetString){
    //echo 'fired';
    $breakDown = explode($delimiter, $targetString);
    $startTime = substr_replace($breakDown[4] , ':', -2, 0);
    $endTime = substr_replace($breakDown[5] , ':', -2, 0);
    $startString = "$breakDown[1]/$breakDown[2]/2015 $startTime";
    $endString = "$breakDown[1]/$breakDown[2]/2015 $endTime";
    $startFormat = strtotime($startString);
    $endFormat = strtotime($endString);
    $start = date('m/d/Y G:i',$startFormat);
    $end = date('m/d/Y G:i',$endFormat);

    return "Session Times: $start -- $end <br>";
}
echo conflictParse('_','hours_9_5_p02_800_845');

但我不清楚如何使用日期开始和结束时间的范围来检查 MULTIPLE 其他日期 start/end 时间 范围?

也许只是坚持 PHP parse/check 在提交时发生冲突,然后 return 一些(原始)名称页面数组到页面(对于某些 jQuery使用和突出显示元素..等(但我可以稍后处理这方面..现在我需要帮助我如何获得上述解析 'date/time' start/end 范围值检查冲突其他 'date/time' start/end 范围值

更新:

这是我必须用于比较的当前嵌套关联数组:

Array ( 
    [0] => Array ( 
        [id] => hours_9_9_p02_800_845 
        [fullStart] => 09/09/2015 8:00 
        [fullEnd] => 09/09/2015 8:45 
        [month] => 9 
        [date] => 9 
        [session_code] => p02 
        [start] => 8:00 
        [end] => 8:45 
        [hasConflict] => false 
    ) 
    [1] => Array ( 
        [id] => hours_9_9_p02_800_855 
        [fullStart] => 09/09/2015 8:00 
        [fullEnd] => 09/09/2015 8:55 
        [month] => 9 
        [date] => 9 
        [session_code] => p02 
        [start] => 8:00 
        [end] => 8:55 
        [hasConflict] => false 
    ) 
    [2] => Array ( 
        [id] => hours_9_9_p03_800_845 
        [fullStart] => 09/09/2015 8:00 
        [fullEnd] => 09/09/2015 8:45 
        [month] => 9 
        [date] => 9 
        [session_code] => p03 
        [start] => 8:00 
        [end] => 8:45 
        [hasConflict] => false 
    ) 
    [3] => Array ( 
        [id] => hours_9_9_p04_820_830 
        [fullStart] => 09/09/2015 8:20 
        [fullEnd] => 09/09/2015 8:30 
        [month] => 9 
        [date] => 9 
        [session_code] => p04 
        [start] => 8:20 
        [end] => 8:30 
        [hasConflict] => false 
    ) 
    [4] => Array ( 
        [id] => hours_9_9_p04_845_900 
        [fullStart] => 09/09/2015 8:45 
        [fullEnd] => 09/09/2015 9:00 
        [month] => 9 
        [date] => 9 
        [session_code] => p04 
        [start] => 8:45 
        [end] => 9:00 
        [hasConflict] => false 
    ) 
    [5] => Array ( 
        [id] => hours_9_9_REG_1300_1315 
        [fullStart] => 09/09/2015 13:00 
        [fullEnd] => 09/09/2015 13:15 
        [month] => 9 
        [date] => 9 
        [session_code] => REG 
        [start] => 13:00 
        [end] => 13:15 
        [hasConflict] => false 
    ) 
    [6] => Array ( 
        [id] => hours_9_9_REG_1300_1330 
        [fullStart] => 09/09/2015 13:00 
        [fullEnd] => 09/09/2015 13:30 
        [month] => 9 
        [date] => 9 
        [session_code] => REG 
        [start] => 13:00 
        [end] => 13:30 
        [hasConflict] => false 
    ) 
) 

我需要将您的 js 函数转换为 PHP,当然我想在我的时间比较中使用 fullStart/fullEnd 变量……??

(但你的功能仍然让我感到困惑,因为我看到对事件 1、事件 2 的引用..(以匹配你的示例)..

更新 2:

以上是我的object/array(关联数组),我通过选中一些复选框并提交我的表单...

这是我尝试将您的 JS 代码转换为基于 PHP 的[带有一些更新变量名]:(以及注释掉的行只是为了尝试在某处获得某种输出)

print_r($conflict_list);

    function checkFirst($cf_presX, $cf_presY) {
        //$cf_presX['fullStart'] < $cf_presY['fallStart'] ? checkConflict($cf_presX, $cf_presY) : checkConflict($cf_presY, $cf_presX);

        echo 'Pres Check: '.$cf_presX[0] . '<br>';
        echo 'Pres Check: '.$cf_presY[0] . '<br>';
        /*
        function checkConflict ($cc_presX, $cc_presY) {      
            if ($cc_presX.['fullEnd'] > $cc_presY.['fullStart']) {
                $cc_presX.['hasConflict'] = true;
                $cc_presY.['hasConflict'] = true;
            }
        }
        */
    }

    function setConflicts($events) {
        for ($i = 0; $i < count($events); $i++) {
            for ($j = 0; $i < count($events); $j++) {
              // if it is not the same event
              // if (i !== j) is the same $age['Peter']
              if ($events[$i]['id'] !== $events[$j]['id']) {
                checkFirst($events[$i], $events[$j]);
              }
            }
        }
    }
    setConflicts($conflict_list);

我不断得到一个带有未定义偏移量的循环:(计数到 100k+ 标记)

Notice: Undefined offset: 0 in C:\wamp\www\projects\misc\conflict_check_new.php on line 49 Pres Check:

Notice: Undefined offset: 0 in C:\wamp\www\projects\misc\conflict_check_new.php on line 50 Pres Check:

Notice: Undefined offset: 0 in C:\wamp\www\projects\misc\conflict_check_new.php on line 49 Pres Check:

同样的逻辑也适用于 PHP,但假设您可以将事件输出到 JavaScript 并创建一个包含开始日期和结束日期的对象数组,如下所示:

var events = [
  {
    id: 'event1',
    start: new Date('1/1/1 5:00'),
    end: new Date('1/1/1 6:00'),
    hasConflict: false
  },
  {
    id: 'event2',
    start: new Date('1/1/1 5:30'),
    end: new Date('1/1/1 6:30'),
    hasConflict: false
  },
  {
    id: 'event3',
    start: new Date('1/1/1 7:30'),
    end: new Date('1/1/1 8:30'),
    hasConflict: false
  }
]

您可以比较事件以查看第一个开始的事件的结束时间是否晚于第二个事件的开始时间。

function checkFirst (event1, event2) {
  event1.start < event2.start 
    ? checkConflict(event1, event2) 
    : checkConflict(event2, event1)

  function checkConflict (first, second) {      
    if (first.end > second.start) {
      first.hasConflict = second.hasConflict = true
    }
  }
}

然后你们可以互相检查事件。这是一个不是特别有效但至少合适的循环:

function flagAllEventsWithConflicts (events) {
  events.forEach(event1 => {
    events.forEach(event2 => {
      event1.id !== event2.id && checkFirst(event1, event2)
    })
  })
}

更新: 上面的函数也可以写成嵌套的for循环:

function flagAllEventsWithConflicts (events) {
  for (var i = 0; i < events.length; i++) {
    for (var j = 0; j < events.length; j++ {
      // if it is not the same event
      // if (i !== j) is the same
      if (events[i].id !== events[j].id) {
        checkFirst(events[i], events[j])
      }
    }
  }
}

然后检查hasConflict是对还是错:

flagAllEventsWithConflicts(events)
console.table(events)

Run this fiddle and checkout the console