PHP中如何合并数值相近的范围数组?
合并PHP中数值相近的范围数组的简便方案
我完全懂你在处理这类范围数组时的头疼——明明觉得逻辑没问题,但合并出来的结果总是不对。别担心,这里有一套简单又可靠的解决思路,咱们一步步来搞定:
核心思路拆解
要合并相近的范围,关键在于先排序,再逐个合并:
- 先把所有范围按起始值从小到大排序,这样我们只需要和上一个合并好的范围对比就行,不用回头检查前面的
- 遍历排序后的数组,判断当前范围和已合并的最后一个范围是否满足“相近”的条件,满足就合并,不满足就单独加入
具体代码实现
假设你的原始范围数组是这样的(可能是无序、有重叠或相近的):
$ranges = [ [1, 5], [7, 10], [3, 6], [12, 15], [11, 13] ];
第一步:排序范围数组
先按每个范围的起始值升序排列,这是合并的基础:
usort($ranges, function($a, $b) { return $a[0] - $b[0]; });
第二步:合并相近范围
这里我定义“相近”为两个范围的间隔≤1(比如前一个范围的结束值+1 ≥ 后一个的起始值,就算可以合并)。如果你的“相近”标准不同,直接调整判断条件里的阈值就行:
$merged = []; foreach ($ranges as $range) { // 合并数组为空时,直接加入第一个范围 if (empty($merged)) { $merged[] = $range; continue; } // 取合并数组的最后一个范围 $lastMerged = end($merged); // 判断是否满足合并条件(可自定义阈值) if ($range[0] <= $lastMerged[1] + 1) { // 合并:起始取最小,结束取最大 $merged[count($merged)-1] = [ min($lastMerged[0], $range[0]), max($lastMerged[1], $range[1]) ]; } else { // 不满足条件,直接加入新范围 $merged[] = $range; } }
测试输出
运行上面的代码后,打印$merged会得到:
print_r($merged); // 输出: // Array // ( // [0] => Array // ( // [0] => 1 // [1] => 10 // ) // [1] => Array // ( // [0] => 11 // [1] => 15 // ) // )
灵活调整的小技巧
- 自定义“相近”阈值:如果你的需求是间隔≤2才合并,把
$lastMerged[1] + 1改成$lastMerged[1] + 2就行 - 处理单个值范围:如果数组里有单个数值的范围(比如
[8,8]),这个逻辑也能自动把它合并到相邻的范围里 - 开/闭区间适配:如果你的范围是开区间(比如不包含端点),可以把判断条件改成
$range[0] < $lastMerged[1] + 1,根据实际场景调整
内容的提问来源于stack exchange,提问作者Bhavik Hirani
相关产品推荐
相关产品推荐

