PHP/Laravel中检查数组值并输出对应状态的问题排查
问题排查与解决:报表复选框状态判断失效
问题原因
array_search的返回值陷阱:array_search找到元素时会返回它的索引位置(比如数组第一个元素返回0),而PHP中0会被@if判定为false,导致明明存在的元素却输出0。- 字符串匹配错误:第三个判断里的
'score-11 '多了一个空格,和存储的'score-11'完全不匹配,永远找不到对应值。 - 数据类型隐患:
json_decode默认返回对象类型,虽然array_search能处理对象,但转为数组更符合常规数组操作的预期,避免潜在问题。
解决方案
- 替换
array_search为in_array():它直接返回布尔值true/false,不会有索引值的判断歧义。 - 修正字符串空格:确保判断的字符串和存储的完全一致,去掉
'score-11 '里的多余空格。 - 转JSON为数组:调用
json_decode时添加第二个参数true,将JSON字符串转为关联数组。
修改后的视图核心代码:
@foreach ($feedbacks as $feedback) <tr> <td>{{ $feedback->record_id ?? '-' }}</td> <td>{{ $feedback->cru_user->cru_id ?? '-' }}</td> @php // 转为关联数组,同时处理空值避免报错 $areChecked = json_decode($feedback->areChecked, true) ?: []; $areUnChecked = json_decode($feedback->areUnChecked, true) ?: []; @endphp @if (in_array('score-1', $areChecked)) <td>{{ 1 }}</td> @else <td>{{ 0 }}</td> @endif @if (in_array('score-6', $areChecked)) <td>{{ 1 }}</td> @else <td>{{ 0 }}</td> @endif @if (in_array('score-11', $areChecked)) {{-- 去掉多余空格 --}} <td>{{ 1 }}</td> @else <td>{{ 0 }}</td> @endif <!-- 其余判断代码省略 --> <td> {{ count($areChecked) }} </td> <td>{{ (count($areChecked) / 20) * 100 }}</td> <td></td> <td></td> <td>{{ $feedback->elevation_audit->name ?? '-' }}</td> </tr> @endforeach
额外优化:添加?: []处理空值,避免当areChecked字段为空时,json_decode返回null导致in_array和count函数报错。
内容的提问来源于stack exchange,提问作者Bilal Ahmed
相关产品推荐
相关产品推荐

