CodeIgniter中in_array与AND逻辑联用条件失效求助
解决你的PHP条件判断不生效问题
兄弟,我来帮你捋捋这个条件没触发的问题——你想遍历1-12月,筛选出不在维护月份数组里且支付状态为failure的月份,但条件没生效对吧?我整理了几个大概率的问题点和解决办法:
1. 先检查$maintain_month的元素类型
你用in_array($i, $maintain_month)判断时,$i是range(1,12)生成的整数,但如果$maintain_month里存的是字符串类型的月份(比如['1', '3', '5']),或者是带前导零的格式(比如'01'),就可能导致匹配失败。
解决办法:
- 统一数组元素类型:把
$maintain_month的元素转成整数,比如$maintain_month = array_map('intval', $maintain_month); - 用严格模式匹配:
!in_array($i, $maintain_month, true),强制同时匹配值和类型。
2. 排查$pay->status的实际值
很多时候是状态值的细节坑:比如实际存储的是'Failure'/'FAILURE',或者字符串前后带空格(比如' failure '),都会让$pay->status == 'failure'不成立。
解决办法:
- 先打印实际值确认:在循环前加
var_dump($pay->status); exit;,看看它的类型和真实内容。 - 处理大小写问题:用
strtolower($pay->status) == 'failure'做不区分大小写的比较。 - 去除前后空格:
trim($pay->status) == 'failure'。
3. 注意AND和&&的优先级差异
PHP里AND的优先级比&&低很多,有可能导致你的条件被错误解析(比如和后面的代码逻辑意外结合)。
解决办法:
把AND换成&&,或者给两个条件都加括号明确优先级:
if ( (!in_array($i, $maintain_month)) && ($pay->status == 'failure') ) { // 你的业务代码 }
4. 确认$pay状态在循环中没有变化
如果$pay对象在循环过程中被重新赋值或修改了状态,后面的判断自然会失效。你可以在循环里加调试输出,实时查看每一轮的条件是否符合预期:
foreach(range(1,12) as $i) { echo "当前月份:$i,支付状态:{$pay->status}<br>"; if (!in_array($i,$maintain_month) && $pay->status=='failure'){ $pmoth = date('F',mktime(0,0,0,$i,1)); $month=date('m'); echo $pmoth; } }
调整后的示例代码
结合上面的排查点,整理后的代码参考:
// 统一维护月份为整数类型 $maintain_month = array_map('intval', $maintain_month); foreach(range(1,12) as $i) { // 严格匹配数组元素,同时处理状态的大小写和空格 if (!in_array($i, $maintain_month, true) && trim(strtolower($pay->status)) == 'failure'){ $pmoth = date('F', mktime(0, 0, 0, $i, 1)); $month = date('m'); echo $pmoth; } }
你按照上面的步骤一步步排查,应该就能找到问题所在啦!
内容的提问来源于stack exchange,提问作者S.A.
相关产品推荐
相关产品推荐

