如何在 PHP 中正确判断数组是否包含指定值(如 [1,2,2,3])

本文详解如何在 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 的集合方法,代码更简洁、语义更清晰:

$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),启用严格模式。

通过以上修正,你的条件判断将准确、健壮且易于维护。