这篇算是最近写了一堆 bug
后的反省吧,日常开发中,我们总是要处理各种边界问题,尤为常见的就是给定一组范围,判断给定的范围是否在目标范围之内或者之外或者重叠之类的。这一类的判断情况稍不注意就容易滋生 bug
,既然我已经中枪了,那么我就来说说这个情况如何处理。
问题
检查给定的一组范围的任意一个端点是否在目标范围之内
根据这个问题,我们马上想到这个要确定两种情况:
- 包含端点本身,即某个端点只要重叠就算,比如:
[1, 2]
在 [2, 3]
端点之内,重叠部分为 2
- 不包含端点本身,即使有重叠的端点也不能算,比如:
[1, 2]
不在 [2, 3]
端点之内,虽然有重叠部分,抱歉的是此 2
非彼 2
至于包不包含端点本身,视具体的情况而定
方案
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| <?php
class Range { public static function main() { $source = [1, 4]; $target = [4, 6];
$overlapWith = self::overlapWith($source, $target, true);
$nonOverlapWith = self::overlapWith($source, $target);
var_dump($overlapWith, $nonOverlapWith); }
public static function overlapWith(array $source, array $target, $overlap = false): bool { sort($source); sort($target);
if ($overlap) { return self::includeOverlap($source, $target); }
return self::exclusiveOverlap($source, $target); }
private static function includeOverlap(array $source, array $target): bool { [$begin, $end] = $source;
if ($target[1] < $begin) { return false; }
if ($target[0] > $end) { return false; }
return true; }
private static function exclusiveOverlap(array $source, array $target): bool { [$begin, $end] = $source;
if ($target[1] <= $begin) { return false; }
if ($target[0] >= $end) { return false; }
return true; } }
Range::main();
bool(true) bool(false)
|