Laravel中如何正确用foreach和if遍历集合处理学生缴费统计?
解决缴费统计中累计变量污染的问题
你的核心问题是$tot变量在所有学生循环外初始化,导致它会累计所有学生的缴费金额,而非仅当前学生的。比如处理student3时,$tot已经带着student1和student2的缴费总额,自然会出现误判。
解决方案
把$tot的初始化移到外层foreach循环内部,保证每个学生的缴费总额独立计算。同时调整判断逻辑:先统计完当前学生的所有缴费,再统一判断一次(避免同一名学生被多次计数)。
修正后的代码
$counter1 = 0; // 未满足2个月缴费的学生数 $counter2 = 0; // 满足2个月缴费的学生数 foreach($student as $st) { $tot = 0; // 每个学生单独初始化缴费总额 $pay = $payment->where('student', $st->name); // 先累加当前学生的所有缴费记录 foreach($pay as $p) { $tot += $p->payment; } // 统一判断当前学生是否达标 if($tot < 2 * $st->payment) { $counter1 += 1; } else { $counter2 += 1; } }
关键调整说明
$tot在每个学生的循环内初始化,彻底避免跨学生的金额累计- 先完成当前学生的缴费总额计算,再做一次判断,解决原代码中同一名学生被重复计数的问题
- 条件判断简化为
$tot < 2 * $st->payment,和原逻辑等价但更直观
内容的提问来源于stack exchange,提问作者M. Rivaldi Anwar Putra
相关产品推荐
相关产品推荐

