所以我试图弄清楚如何使用PHP和MySQL数据库检查两次重叠。
这是我用来检查它们是否重叠的函数:
function testRange($start_time1,$end_time1,$start_time2,$end_time2) {
return ($end_time1 < $start_time2) ? false : ($start_time1 > $start_time2) && ($start_time1 > $end_time2) ? false : true;
}
AFAIK应该可以正常工作,所以我去检查时间是否重叠并添加任何重叠的数组:
$clashes = [];
$idTracker = [];
foreach ($userBands as $show) {
foreach ($userBands as $show1) {
if(!($show->id == $show1->id)) {
if(strcmp($show->date, $show1->date) == 0 && testRange(strtotime($show->time), strtotime($show->time) + ($show->length*60), strtotime($show1->time), strtotime($show1->time) + ($show1->length*60))) {
array_push($clashes, [
"s1_id" => $show->id,
"s2_id" => $show1->id
]);
}
}
}
}
foreach ($clashes as $clash) {
foreach ($clashes as $clash1) {
//If Clash1->ID1 == Clash2->ID1 then
}
print_r($clash);
echo "<br>";
}
然而,当我打印出$ clashes数组的条目时,我将其作为输出:
这完全错了,因为这是数据库的内容:
27和26不应该与25冲突,但它们被跟踪到$ clashes数组中。为什么会这样?
数据库信息:
Date是Date SQL类型,Time是Time SQL类型,Length是double(8,2)SQL类型
$ userBands信息:
$ userBands变量是Show model
的Laravel集合答案 0 :(得分:1)
第一: 您可以更改SQL查询以获取结束时间,如下所示:
SELECT *,
ADDTIME(
CONCAT(time,'.0'),
CONCAT(CONCAT(CONCAT( length DIV 60, ':' ), length MOD 60) ,':0.0')
) AS EndTime
FROM `table`;
现在你有了一个名为EndTime的列,
所以这段代码可以工作:
if(strcmp($show->date, $show1->date) == 0 &&
newTestRange(
strtotime($show->time),
strtotime($show->EndTime),
strtotime($show1->time),
strtotime($show1->EndTime)
) ) {
我不知道为什么会这样:
function newTestRange($start_time1,$end_time1,$start_time2,$end_time2) {
// 12:30:00 13:20:00 12:45:00 13:45:00
// return ($end_time1 < $start_time2) ? false : ($start_time1 > $start_time2) && ($start_time1 > $end_time2) ? false : true;
$ret = false; // its all okay.
if ($start_time1 < $start_time2 ){
if ($end_time1 > $start_time2 ){
$ret = true;echo "\n case1-$start_time1-colide-$start_time2 \n";
}
} else if ($end_time2 > $start_time1){
$ret = true; echo "\n case2-$start_time1-colide-$start_time2 \n";
}
return $ret;
}
但你必须考虑4种不同的场景:
因此,如果一个事件包含另一个事件,您将找到它。
最佳!
答案 1 :(得分:0)
通过更改比较时间的算法来修复它。
新版本:
function testRange($s1, $e1, $s2, $e2) {
return $s1 <= $e2 && $s2 <= $e1;
}
不知道为什么这比前一个更有效。