You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何该PHP if语句返回true?目标元素不在判断条件中

问题根源:逻辑或运算符的误用导致松散匹配

你遇到的这个问题,核心是错误地在in_array()的第一个参数里使用了||逻辑或运算符,而不是传入需要检查的字符串集合。咱们一步步拆解原因:

1. 逻辑或表达式的计算结果

先看你代码里的这部分:

in_array("12x15 Purple and Yellow 2" || "11x13 Red and Yellow 1" || ... , $btypes)

在PHP中,||是逻辑或运算符,它会逐个计算操作数:

  • 第一个操作数是非空字符串"12x15 Purple and Yellow 2",在布尔语境下会被视为true
  • 逻辑或只要遇到第一个true就会停止计算,直接返回true

所以整个"A" || "B" || "C"的表达式结果是布尔值true,而不是你期望的多个字符串的集合。

2. in_array()的松散匹配问题

当你调用in_array(true, $btypes)时,PHP默认使用松散比较(第三个参数默认是false)。此时,它会把数组里的每个元素和true做松散等价判断:

  • 非空字符串在布尔转换时都会变成true
  • 你的$btypes数组里的两个元素都是非空字符串,所以松散匹配下,in_array(true, $btypes)会返回true

同理,第二个in_array()里的"Bootcamp Obstacle Course" || ...同样会计算为true,再次匹配数组里的非空字符串,返回true。

3. 最终条件结果

两个in_array()都返回true,所以true && true的结果就是true,导致if语句的代码块执行,返回对应的字符串——哪怕你的数组里并没有包含任何你原本想检查的障碍课程元素。

正确的写法

要实现你原本的需求(检查数组是否包含某一组字符串中的任意一个,同时包含另一组中的任意一个),应该把每组字符串放进数组,然后用array_intersect()来判断:

$bounceCastles = [
    "12x15 Purple and Yellow 2",
    "11x13 Red and Yellow 1",
    "12x15 Yellow and Purple old",
    "11x13 Red and Yellow 2",
    "12x15 Purple and Yellow 1"
];

$obstacleCourses = [
    "Bootcamp Obstacle Course",
    "Terminator Torment Obstacle Course",
    "Lizard Obstacle Course",
    "Bugs Obstacle Course",
    "Nemo Obstacle Course"
];

// 检查数组是否有交集(即包含目标组中的任意元素)
$hasBounceCastle = !empty(array_intersect($btypes, $bounceCastles));
$hasObstacleCourse = !empty(array_intersect($btypes, $obstacleCourses));

if ($hasBounceCastle && $hasObstacleCourse) {
    return "Standard Bouncy Castle and an Obstacle Course";
}

这样就能准确判断数组是否包含你指定的任意一个弹力城堡,同时包含任意一个障碍课程了。

内容的提问来源于stack exchange,提问作者Kevin Foley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:41:52