PHP多选项条件判断不生效,如何正确校验post_type多个取值?
错误原因分析
你尝试的两种写法都不符合PHP的语法规则:
- 第一种用逗号分隔多个值的写法:PHP中逗号是表达式分隔符,该写法只会生效第一个
$post->post_type != 'movies'判断,后面的两个字符串会被当做独立表达式直接忽略,完全达不到多值匹配的效果。 - 第二种把多个值写在同一个字符串里的写法:相当于判断
$post->post_type是否不等于movies, tvshows, episodes这一整个长字符串,不可能匹配到你需要的三个独立文章类型。
正确实现方案
方案1:拆分判断条件
如果要判断$post->post_type不在指定的三个值范围内,需要把三个判断条件用逻辑与(&&)连接,注意这里不能用逻辑或(||),否则会出现逻辑恒真的问题:
// 错误的逻辑或写法:只要值不等于任意一个就为真,所有值都会满足条件 // $post->post_type != 'movies' || $post->post_type != 'tvshows' || $post->post_type != 'episodes' // 正确的逻辑与写法:值同时不等于三个值的时候才满足条件 $post->post_type != 'movies' && $post->post_type != 'tvshows' && $post->post_type != 'episodes'
方案2:使用in_array()函数(更推荐)
当判断的可选值较多时,用in_array()函数写法更简洁易维护,直接判断值是否在指定数组中即可:
// 判断post_type不在指定数组中 !in_array($post->post_type, ['movies', 'tvshows', 'episodes'], true)
第三个参数true表示开启严格类型匹配,可以避免PHP隐式类型转换导致的逻辑漏洞。如果你的PHP版本低于5.4,不支持短数组语法,可以替换为array()写法:
!in_array($post->post_type, array('movies', 'tvshows', 'episodes'), true)
修复后的完整代码
确认你的原有逻辑是只要满足三个条件任意一个就提前返回,修复后完整代码如下:
if ( $new_status != 'publish' || $old_status == 'publish' || !in_array($post->post_type, ['movies', 'tvshows', 'episodes'], true) ) { return; }
内容的提问来源于stack exchange,提问作者Bekerly Alley
相关产品推荐
相关产品推荐

