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

PHP/Laravel中检查数组值并输出对应状态的问题排查

问题排查与解决:报表复选框状态判断失效

问题原因

  1. array_search的返回值陷阱:array_search找到元素时会返回它的索引位置(比如数组第一个元素返回0),而PHP中0会被@if判定为false,导致明明存在的元素却输出0。
  2. 字符串匹配错误:第三个判断里的'score-11 '多了一个空格,和存储的'score-11'完全不匹配,永远找不到对应值。
  3. 数据类型隐患:json_decode默认返回对象类型,虽然array_search能处理对象,但转为数组更符合常规数组操作的预期,避免潜在问题。

解决方案

  1. 替换array_search为in_array():它直接返回布尔值true/false,不会有索引值的判断歧义。
  2. 修正字符串空格:确保判断的字符串和存储的完全一致,去掉'score-11 '里的多余空格。
  3. 转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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 14:24:51