You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中如何合并数值相近的范围数组?

合并PHP中数值相近的范围数组的简便方案

我完全懂你在处理这类范围数组时的头疼——明明觉得逻辑没问题,但合并出来的结果总是不对。别担心,这里有一套简单又可靠的解决思路,咱们一步步来搞定:

核心思路拆解

要合并相近的范围,关键在于先排序,再逐个合并:

  1. 先把所有范围按起始值从小到大排序,这样我们只需要和上一个合并好的范围对比就行,不用回头检查前面的
  2. 遍历排序后的数组,判断当前范围和已合并的最后一个范围是否满足“相近”的条件,满足就合并,不满足就单独加入

具体代码实现

假设你的原始范围数组是这样的(可能是无序、有重叠或相近的):

$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:06:35