php数组找缺失数字需先明确范围:若依数组min/max,则用array_diff(range(min,max),arr);若指定范围如1-100,直接range(1,100);大范围时改用遍历比对避免内存占用。

要找出 PHP 数组中缺失的数字,关键在于明确“缺失”的定义:是连续整数序列中缺了哪些值,还是在某个已知范围内未出现的数字。最常见场景是给定一个由正整数构成的数组(如 [1, 2, 4, 6]),假设它本应是连续序列(如从 1 开始到最大值),找出中间空缺的整数。
确认范围与连续性假设
缺失数字问题必须有参照基准。常见两种设定:
- 数组本身隐含范围:例如最小值为 min、最大值为 max,则完整序列应为
range(min, max),缺失的就是该序列中不在原数组里的数; - 人为指定范围:如“1 到 100 中哪些没出现”,此时用
range(1, 100)作全集更直接。
注意:若数组含重复值、负数或非整数,需先过滤(如用 array_filter($arr, 'is_int') 或强制转整型)。
用 array_diff 快速获取差集
这是最简洁实用的方法,适合中小规模数据(几千以内):
立即学习“PHP免费学习笔记(深入)”;
$arr = [1, 2, 4, 6]; $full = range(min($arr), max($arr)); $missing = array_values(array_diff($full, $arr)); // 重置键名 // 结果:[3, 5]
优点是代码少、可读性强;缺点是当范围极大(如 max-min 达百万级)时,range() 会占用较多内存。此时应换用迭代法。
遍历比对避免内存浪费
适用于大范围或内存敏感场景,不生成完整数组:
$arr = [1, 2, 4, 6];
sort($arr); // 确保升序
$missing = [];
for ($i = $arr[0]; $i <= end($arr); $i++) {
if (!in_array($i, $arr, true)) {
$missing[] = $i;
}
}
// 结果:[3, 5]
优化建议:
- 将原数组转为键值对(
$lookup = array_flip($arr)),把in_array换成isset($lookup[$i]),查找时间从 O(n) 降到 O(1); - 若数组已排序且无重复,可用双指针法进一步减少判断次数。
处理多段缺失或自定义起始点
如果要求“从 1 开始补全到最大值”,或“找出 10–20 中缺失的数”,只需调整 range() 的参数:
// 找出 1 到 max 之间所有缺失(含开头可能缺的 1) $max = max($arr); $full = range(1, $max); $missing = array_values(array_diff($full, $arr)); // 找出指定区间 [10, 20] 内缺失的数 $full = range(10, 20); $missing = array_values(array_diff($full, $arr));
这种写法灵活,配合 array_intersect 还能做交集筛选,比如只关心偶数缺失项。











