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。
针对动态审批系统的优化建议
考虑到你正在开发可根据可变规则修改全程序的动态审批系统,规则会频繁变化,这里给两个优化方向:
- 规则与查找逻辑解耦:把生成
$arrayOfNumbersToSkip的逻辑封装成独立模块,比如根据审批流程、角色权限等动态生成跳过列表,查找函数只负责执行数字检查,这样后续修改规则时无需改动查找逻辑。 - 提升查找效率:如果跳过列表很大或者区间范围广,
in_array的效率会偏低,建议把跳过列表转换成关联数组(键为要跳过的数字),这样检查是否存在的时间复杂度从O(n)降到O(1):
// 转换为关联数组 $skipMap = array_flip($arrayOfNumbersToSkip); // 检查时用isset($skipMap[$i])代替in_array($i, $arrayOfNumbersToSkip)
这样的设计更符合动态系统的扩展性需求,后续调整审批规则会更灵活。
内容的提问来源于stack exchange,提问作者RG Servers
相关产品推荐
相关产品推荐

