个时间段判断是否重叠比较常见,
如: startdate1 -- enddate1
startdate2 -- enddate2
当然前提是保证开始时间早于结束时间,什么你问如果不是?那你就自己处理一下保证开始时间早于结束时间.
可能首先想到的是
(startdate2 between startdate1 and enddate1)
or (enddate2 between
startdate1 and enddate1)
or(startdate1 between startdate2 and enddate2
)
or(enddate1 between startdate2 and enddate2)
以此类推,多段也貌似能够判断,但是否能完全覆盖到呢?有兴趣可以自己验证一下.
但是个人感觉有点麻烦,在此介绍一个简单的方法.如果你发现此方法有问题欢迎一起讨论.
假设要加入的时间段为 as1 ae1
已存在的所有时间段为 xs1 xe1
xe1>as1 and xs1<ae1
满足有重叠,不满足无重叠
同时满足绿和红则有重叠
绿线:已存在的所有结束时间大于要添加的开始时间
红线:已存在的所有开始时间都小于要添加的结束时间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 |
$xs1 = 1; $xe1 = 7; $data = array ( array (-7, 0), array (-1, 2), array (2, 4), array (5, 10), array (-2, 11), array (8, 11), ); $newdata
= array (); foreach ( $data
as $row ){ $as1 = $row [0]; $ae1 = $row [1]; if ( $xe1
>= $as1
&& $xs1
<= $ae1 ){ array_push ( $newdata , $row ); } } echo
( count ( $newdata )); print_r( $newdata ); |
原文:http://www.cnblogs.com/lovekingly/p/3611810.html