![如何在 PHP 中正确判断数组是否包含指定值(如 [1,2,2,3])](https://img.php.cn/upload/article/001/246/273/176750808610694.jpg)
本文详解如何在 if 条件中准确检查数组是否包含特定元素(如数字 1、2 或 3),指出 `in_array()` 的常见误用,并提供安全、可读、符合 laravel/lumen 最佳实践的判断方案。
在 PHP 中,判断一个解码后的数组(例如由 json_decode($payment_scheme, true) 得到的 [1,2,2,3])是否包含某个值,关键在于明确判断目标:你是想检查数组中是否存在某个单个元素(如 1),还是想匹配整个数组结构(即完全等于 [1,2,2,3])?从你的代码来看,你实际需要的是前者——但当前写法存在根本性逻辑错误。
❌ 错误写法解析
if(in_array("1223", $payment)) { ... }这段代码有两处严重问题:
- $payment 是 foreach 循环中取出的单个标量值(如 1、2),而非数组,因此不能作为 in_array() 的第二个参数(该参数必须是数组);
- "1223" 是字符串,而数组中是整数 1、2、2、3,类型不匹配且语义错误(你并非在查找拼接后的字符串)。
PHP 8.0+ 更会直接抛出 Fatal error: Uncaught TypeError: in_array(): Argument #2 ($haystack) must be of type array, int given。
✅ 正确做法:按需选择判断方式
✅ 场景一:检查数组中是否存在某个值(推荐)
$array = json_decode($payment_scheme, true); // e.g., [1,2,2,3]
// 检查是否包含数字 1(严格类型匹配)
if (in_array(1, $array, true)) {
echo 'Condition 1 CASH';
$collection = collect();
return response()->json(['results' => $collection], 200);
}? 提示:第三个参数 true 启用严格类型检查(避免 '1' == 1 的隐式转换),更安全。
✅ 场景二:检查是否包含多个值中的任意一个
$targetValues = [1, 2];
if (count(array_intersect($array, $targetValues)) > 0) {
// 数组中至少有一个值在 $targetValues 中
}✅ 场景三:检查数组是否完全等于 [1,2,2,3]
$expected = [1, 2, 2, 3];
if ($array === $expected) { // 使用全等(===),确保值+类型+顺序完全一致
// 执行逻辑
}? 进阶建议(Laravel 环境)
利用 Laravel 的集合方法,代码更简洁、语义更清晰:
立即学习“PHP免费学习笔记(深入)”;
$collection = collect(json_decode($payment_scheme, true));
if ($collection->contains(1)) {
$result = collect();
return response()->json(['results' => $result], 200);
}
// 或检查多个值
if ($collection->intersect([1, 2])->isNotEmpty()) {
// ...
}⚠️ 注意事项总结
- ❌ 不要在 foreach 中对单个元素调用 in_array(..., $singleValue);
- ✅ 使用 in_array($needle, $array, true) 判断存在性;
- ✅ 优先使用 collect()->contains() 在 Laravel 项目中提升可读性;
- ✅ 始终验证 json_decode 结果是否为数组(可加 is_array($array) && !empty($array) 防御);
- ✅ 避免字符串与数字混用(如 "1" vs 1),启用严格模式。
通过以上修正,你的条件判断将准确、健壮且易于维护。











