
本文介绍两种高效方法:使用 `in_array()` 遍历比对,或直接调用 `array_diff()` 获取差集,精准识别并提取 array2 中不在 array1 内的所有值(含重复项)。
在 PHP 开发中,常需判断一个数组(如用户提交的数据)是否含有“不在白名单数组中”的值。例如,给定两个数组:
$Array_1 = [5836, 5837]; // 白名单/基准数组 $Array_2 = [5837, 2836, 2836]; // 待检测数组(含重复值)
目标是找出 $Array_2 中所有未出现在 $Array_1 中的元素(即 2836, 2836),且保留原始出现次数与键名信息。
✅ 方法一:使用 array_diff()(推荐,简洁高效)
array_diff($array1, $array2) 返回 $array1 中存在但 $array2 中完全不存在的所有值(保留原始键名和重复项),语义清晰、性能优异,是解决本问题的首选方案:
$result = array_diff($Array_2, $Array_1); print_r($result); // 输出: // Array // ( // [1] => 2836 // [2] => 2836 // )
⚠️ 注意:array_diff() 的参数顺序至关重要——第一个参数是「被减数」(源数组),后续参数均为「减数」。此处必须写为 array_diff($Array_2, $Array_1),而非反向。
若只需布尔判断(是否存在差异),可结合 empty() 使用:
立即学习“PHP免费学习笔记(深入)”;
if (!empty(array_diff($Array_2, $Array_1))) {
echo "Array_2 包含 Array_1 中没有的值";
}✅ 方法二:使用 in_array() 手动遍历(灵活可控)
当需要在检测过程中执行自定义逻辑(如记录日志、中断流程、统计频次)时,foreach + in_array() 提供更高灵活性:
foreach ($Array_2 as $key => $value) {
if (!in_array($value, $Array_1, true)) { // 建议启用严格比较(第三个参数 true)
echo "索引 {$key}: {$value} 不在 Array_1 中\n";
}
}
// 输出:
// 索引 1: 2836 不在 Array_1 中
// 索引 2: 2836 不在 Array_1 中? 提示:in_array() 默认进行松散比较(==),若数组含混合类型(如字符串 '5836' 与整型 5836),务必传入 true 启用严格模式(===),避免意外匹配。
? 总结与选型建议
| 场景 | 推荐方法 | 说明 |
|---|---|---|
| 仅需获取差集数组(含键/重复) | array_diff() | 性能好、代码短、语义明确 |
| 需在检测中执行副作用操作(如报错、计数、跳过) | foreach + in_array() | 控制力强,便于扩展逻辑 |
| 数组极大(>10k 元素) | 先将 $Array_1 转为 array_flip() 哈希表,再用 isset() 替代 in_array() | 时间复杂度从 O(n×m) 降至 O(n+m) |
最后提醒:PHP 数组函数默认区分键名与值,array_diff() 比较的是值而非键;若需键值双重校验,请使用 array_diff_assoc() 或自定义回调(array_udiff())。











