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的值执行对应逻辑,比如显示状态灯、提示信息等
代码说明:
- 默认状态初始化:先把
$light设为0,避免分支遗漏导致变量未赋值的问题 - 空值判断优化:直接用
if ($bom_id)代替$bom_id >0,更贴合Laravel的查询结果判断逻辑(未查到数据时first()会返回null) - 循环内差值处理:每次计算差值后,通过三元运算符完成“小于0则设为0”的逻辑,同时可以按需输出处理结果
- 状态标记逻辑:用
$hasShortage变量记录是否存在物料不足的情况,循环结束后统一设置$light,避免多次判断的冗余
这样就完全符合你的需求:遍历每个BOM明细处理差值,最终得到正确的状态标记。
内容的提问来源于stack exchange,提问作者Paul Kiarie
相关产品推荐
相关产品推荐

