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

PHP如何查找指定区间内数组未包含的首个及下一个可用数字?

解决区间内跳过指定数字的可用数字查找问题

刚好帮你搞定这个数字查找需求,结合你提到的动态审批系统场景,我整理了清晰的实现方案和优化思路:

先明确你的基础参数:

$starting = 0;
$arrayOfNumbersToSkip = [1, 3, 4, 5, 6];
$ending = 7;

问题1:获取首个可用数字

我们可以从起始值开始逐个遍历区间,找到第一个不在跳过列表里的数字。代码实现如下:

function findFirstAvailable($start, $skipList, $end) {
    for ($i = $start; $i <= $end; $i++) {
        if (!in_array($i, $skipList)) {
            return $i;
        }
    }
    // 若区间内无可用数字,可返回null或根据业务需求自定义处理
    return null;
}

// 调用示例
$firstAvailable = findFirstAvailable($starting, $arrayOfNumbersToSkip, $ending);
echo $firstAvailable; // 输出:2

逻辑说明:从0开始依次检查,0之后的1在跳过列表里,直到2不在列表中,所以返回2。

问题2:获取下一个可用数字

这里的“下一个”指的是首个可用数字之后的下一个符合条件的数字,我们可以基于首个结果继续往后查找:

function findNextAvailable($start, $skipList, $end, $after = null) {
    // 若指定了基准数字,就从它的下一位开始遍历
    $startFrom = $after !== null ? $after + 1 : $start;
    for ($i = $startFrom; $i <= $end; $i++) {
        if (!in_array($i, $skipList)) {
            return $i;
        }
    }
    return null;
}

// 调用示例:先找到首个可用数字,再找它之后的下一个
$firstAvailable = findFirstAvailable($starting, $arrayOfNumbersToSkip, $ending);
$nextAvailable = findNextAvailable($starting, $arrayOfNumbersToSkip, $ending, $firstAvailable);
echo $nextAvailable; // 输出:7

逻辑说明:从2的下一位3开始检查,3-6都在跳过列表里,直到7不在列表中,所以返回7。

针对动态审批系统的优化建议

考虑到你正在开发可根据可变规则修改全程序的动态审批系统,规则会频繁变化,这里给两个优化方向:

  1. 规则与查找逻辑解耦:把生成$arrayOfNumbersToSkip的逻辑封装成独立模块,比如根据审批流程、角色权限等动态生成跳过列表,查找函数只负责执行数字检查,这样后续修改规则时无需改动查找逻辑。
  2. 提升查找效率:如果跳过列表很大或者区间范围广,in_array的效率会偏低,建议把跳过列表转换成关联数组(键为要跳过的数字),这样检查是否存在的时间复杂度从O(n)降到O(1):
// 转换为关联数组
$skipMap = array_flip($arrayOfNumbersToSkip);
// 检查时用isset($skipMap[$i])代替in_array($i, $arrayOfNumbersToSkip)

这样的设计更符合动态系统的扩展性需求,后续调整审批规则会更灵活。

内容的提问来源于stack exchange,提问作者RG Servers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:06:50