PHP Switch Case多值匹配错误排查:为何始终进入首个分支?
问题分析与解决方案
嘿,我一眼就揪出你代码里的问题啦——你在switch的case里用||逻辑或的写法完全不对,这就是为啥不管传啥值,程序都一个劲往第一个分支钻的原因!
错误原因拆解
在PHP里,case ('ate_201803'||'201804_201902')这种写法会先计算括号里的表达式:
- 非空字符串
'ate_201803'在布尔判断里会被认定为true - 逻辑或
||遇到第一个true就会直接返回结果,所以整个表达式最终是布尔值true
而PHP的switch用的是松散比较(==),只要你的$_POST['AnoMes']是个非空字符串,它就会被自动转成布尔值true,刚好和case里的true匹配上——这就导致不管你传的是目标值还是其他非空值,都会跳进这个分支。
正确的多值匹配写法
要让switch里多个值对应同一个分支,你得把多个case语句并列写在一起,中间不加break,等所有要匹配的case列完,再写执行代码和收尾的break:
switch ($_POST['AnoMes']){ // 并列case实现多值匹配 case 'ate_201803': case '201804_201902': echo "The value of the variable AnoMes is: $sAnoMes - here! <b>1</b><br><br>"; switch ($_POST['DDDs']){ case '1x4x5x6x': echo "The value of the variable DDDs is: $sDDDs - here! <b>1 - 1x </b><br><br>"; break; case '2x3x7x8x9x' : echo "The value of the variable DDDs is: $sDDDs - here! <b>1 - 2x </b><br><br>"; break; default: echo 'ERRO! The value is wrong for variable DDD! here! <b>1</b><br><br>'; } break; case 'apartir_201903': // 原有的分支代码... break; default: echo 'ERRO! The value is wrong for variable AnoMes!</b><br><br>'; }
记得把代码里所有类似case ('xxx'||'yyy')的地方都改成这种并列写法,包括Recado分支里的相同问题也要同步修改。
改完之后,switch就能精准匹配ate_201803和201804_201902这两个值,其他不符合的内容才会走到对应的分支或者default里啦。
内容的提问来源于stack exchange,提问作者Anderson Silva
相关产品推荐
相关产品推荐

