gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:10:26 26 4
gpt4 key购买 nike

我很难过如何去检查多个*日期/时间值-范围-(意思是:开始结束时间)是否相互冲突。

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

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

复选框的名称是使用有关 session 的信息生成的。 (月/日开始/结束时间以及 session ID)

即: hours_9_5_p02_800_845

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

全部由下划线(“_”)分隔

如果用户检查(并提交)多个 session ,将有许多这些值来检查时间冲突。
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

以上是我“可以”作为用户选择/提交获得的字段列表/数组示例,我需要检查任何可能的冲突(显然用户不能同时在两个地方):) 以上有很多/选择了相同的确切时隙的几个重叠。

** 我对 PHP(在用户提交后检查)或 javascript/jQuery(如果它可以进行日期/时间范围冲突检查,如果在前端)

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

我这样做了:(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');

但我不清楚如何使用这个日期开始和结束时间范围来检查 多个 其他日期开始/结束时间 范围 ?

也许只是坚持在提交时让 PHP 解析/检查冲突,然后将一些(原始)名称页面的数组返回到页面(对于某些 jQuery 使用并突出显示元素..等(但我可以稍后处理该方面..现在我需要关于如何获得上述解析“日期/时间”开始/结束范围值的帮助,以检查是否与其他“日期/时间”开始/结束范围值发生冲突

更新:

这是我必须使用以进行比较的当前嵌套关联数组:
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 变量,我猜..??

(但是当我看到对 event1、event 2 的引用时,您的函数仍然让我感到困惑。(以匹配您的示例)。

更新2:

以上是我从选择一些复选框并提交表单中获得的对象/数组(关联数组)...

这是我尝试将您的 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

关于php - 如何检查与多个日期时间范围的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33192696/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com