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

Laravel中如何在foreach循环中提取值并处理数量差值判断

修正后的实现方案

先帮你梳理下现有代码里的几个问题:

  • 循环内计算了差值$dif但未做任何处理,也没保存结果
  • $arr = array($bomlist->$dif);存在语法错误,而且放在循环外只能获取最后一条数据的(错误)值
  • $check = ''的判断逻辑和你的需求不匹配,没法正确识别差值小于0的情况

根据你“遍历数组判断差值,小于0则将对应值设为0,最终得到状态标记$light”的需求,这里给出修正后的代码:

$bom_id = App\Models\Bom::where('item_id', $item->order_item->id)->pluck('id')->first(); 
$light = 0; // 默认状态为0

if ($bom_id) { 
    $bomList = App\Models\Bom_list::where('bom_id', $bom_id)->get(); 
    echo '<div class="row">'; 

    // 标记是否存在物料不足的情况
    $hasShortage = false;

    foreach ($bomList as $bomlist) { 
        $availableQty = $item->order_item->qty; 
        $requiredQty = $bomlist->qty * $item->qty; 
        $dif = $availableQty - $requiredQty; 

        // 按需求:差值小于0则将对应值设为0,这里处理的是差值本身
        $processedValue = $dif < 0 ? 0 : $dif;

        // 如果需要输出处理后的值,可取消下面注释,配合row结构输出列内容
        // echo "<div class='col-md-4'>物料:{$bomlist->name} | 处理后差值:{$processedValue}</div>";

        // 只要有一组差值小于0,就标记为短缺
        if ($dif < 0) {
            $hasShortage = true;
        }
    } 

    // 没有短缺则light设为1,否则保持0
    $light = $hasShortage ? 0 : 1;
} 

// 后续可根据$light的值执行对应逻辑,比如显示状态灯、提示信息等

代码说明:

  1. 默认状态初始化:先把$light设为0,避免分支遗漏导致变量未赋值的问题
  2. 空值判断优化:直接用if ($bom_id)代替$bom_id >0,更贴合Laravel的查询结果判断逻辑(未查到数据时first()会返回null)
  3. 循环内差值处理:每次计算差值后,通过三元运算符完成“小于0则设为0”的逻辑,同时可以按需输出处理结果
  4. 状态标记逻辑:用$hasShortage变量记录是否存在物料不足的情况,循环结束后统一设置$light,避免多次判断的冗余

这样就完全符合你的需求:遍历每个BOM明细处理差值,最终得到正确的状态标记。

内容的提问来源于stack exchange,提问作者Paul Kiarie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:28:10