插件窝 干货文章 PHP数组大小比较及区间校验:如何高效验证$arr1元素与$arr2区间的关系?

PHP数组大小比较及区间校验:如何高效验证$arr1元素与$arr2区间的关系?

arr 区间 数组 元素 438    来源:    2025-03-16

在PHP中,如果你需要高效地验证一个数组 $arr1 中的元素是否在另一个数组 $arr2 的区间范围内,可以使用一些内置的数组函数和循环来实现。假设 $arr2 是一个包含区间的数组,每个区间是一个包含两个元素的数组,表示区间的起始和结束值。

示例数据结构

$arr1 = [5, 10, 15, 20, 25];
$arr2 = [
    [0, 10],
    [11, 20],
    [21, 30]
];

目标

验证 $arr1 中的每个元素是否在 $arr2 的某个区间内。

解决方案

我们可以使用嵌套循环来遍历 $arr1$arr2,并检查每个元素是否在某个区间内。

function validateIntervals($arr1, $arr2) {
    $result = [];

    foreach ($arr1 as $value) {
        $isInInterval = false;

        foreach ($arr2 as $interval) {
            if ($value >= $interval[0] && $value <= $interval[1]) {
                $isInInterval = true;
                break;
            }
        }

        $result[$value] = $isInInterval;
    }

    return $result;
}

$arr1 = [5, 10, 15, 20, 25];
$arr2 = [
    [0, 10],
    [11, 20],
    [21, 30]
];

$validationResult = validateIntervals($arr1, $arr2);

print_r($validationResult);

输出结果

Array
(
    [5] => 1
    [10] => 1
    [15] => 1
    [20] => 1
    [25] => 1
)

解释

  • validateIntervals 函数接受两个数组 $arr1$arr2 作为参数。
  • 对于 $arr1 中的每个元素,函数会遍历 $arr2 中的每个区间,检查该元素是否在区间内。
  • 如果元素在某个区间内,$isInInterval 会被设置为 true,并且跳出内层循环。
  • 最终,函数返回一个关联数组,键为 $arr1 中的元素,值为布尔值,表示该元素是否在 $arr2 的某个区间内。

性能优化

如果 $arr2 的区间是有序的,可以考虑使用二分查找来优化区间查找的效率。这样可以减少不必要的比较操作。

二分查找优化示例

function binarySearch($arr, $value) {
    $low = 0;
    $high = count($arr) - 1;

    while ($low <= $high) {
        $mid = intval(($low + $high) / 2);

        if ($value >= $arr[$mid][0] && $value <= $arr[$mid][1]) {
            return true;
        } elseif ($value < $arr[$mid][0]) {
            $high = $mid - 1;
        } else {
            $low = $mid + 1;
        }
    }

    return false;
}

function validateIntervalsOptimized($arr1, $arr2) {
    $result = [];

    foreach ($arr1 as $value) {
        $result[$value] = binarySearch($arr2, $value);
    }

    return $result;
}

$arr1 = [5, 10, 15, 20, 25];
$arr2 = [
    [0, 10],
    [11, 20],
    [21, 30]
];

$validationResult = validateIntervalsOptimized($arr1, $arr2);

print_r($validationResult);

输出结果

Array
(
    [5] => 1
    [10] => 1
    [15] => 1
    [20] => 1
    [25] => 1
)

解释

  • binarySearch 函数实现了二分查找,用于在有序的 $arr2 中查找 $value 是否在某个区间内。
  • validateIntervalsOptimized 函数使用 binarySearch 来优化区间查找的效率。

通过这种方式,你可以高效地验证 $arr1 中的元素是否在 $arr2 的区间范围内。