MySQLi fetch数组while循环中变量递增与平均计算错误解决
解决月度平均强度计算的问题
嘿,我明白你遇到的麻烦了!你的思路是对的——要根据实际存在的数据数量来计算平均值,但之前的实现方式有个关键问题:你在逐行处理数据的时候,每次循环只处理一个day_range的记录,然后立刻计算平均值,而且还把$i重置为0了,这就导致$i永远只能是1,因为每次循环只统计了当前这一条数据,而不是该月份所有的有效数据。
更好的解决方案:用数组收集数据
我们可以换个思路,不要用单独的变量(比如$int1_1、$int1_2)来存储每个区间的强度,而是用数组来收集对应月份的所有有效强度值。这样不管有几个区间的数据,我们都能轻松统计总数和计算总和。
修改后的代码大概是这样的:
// 先初始化每个月份的数组,用来存储有效强度值 $monthlyIntensities = [ 1 => [], // 一月 2 => [], // 二月 // 这里可以继续添加其他月份... ]; while ($row = $result->fetch_array(MYSQLI_ASSOC)) { $month = $row['month']; // 只处理我们关心的月份(如果需要的话) if (!isset($monthlyIntensities[$month])) { continue; } // 只要当前行有有效强度值,就添加到对应月份的数组里 // 这里可以根据需要判断day_range是否合法,或者直接收集所有有效数据 if (!empty($row['intensity'])) { $monthlyIntensities[$month][] = $row['intensity']; } } // 现在计算每个月份的平均值 foreach ($monthlyIntensities as $month => $intensities) { $count = count($intensities); if ($count === 0) { // 如果该月份没有数据,设置默认值或者跳过 $avgIntensity = 0; // 或者null,根据你的业务需求来 } else { $total = array_sum($intensities); $avgIntensity = $total / $count; } // 这里可以把结果存起来,比如$monthlyAvg[$month] = $avgIntensity; echo "月份{$month}的平均强度:{$avgIntensity}\n"; }
为什么这个方法更靠谱?
- 我们先把所有数据都收集到对应的数组里,而不是边处理边计算,这样能确保统计到该月份的所有有效数据
- 用
count()获取实际的数据数量,避免了固定除以4的错误 - 代码更简洁,不用为每个月份写重复的判断逻辑,扩展性更好(比如新增月份只需要在初始化数组里加一行)
如果你还是想保留原来的day_range判断
如果你需要严格只收集指定day_range的数据,也可以在添加到数组前做判断:
while ($row = $result->fetch_array(MYSQLI_ASSOC)) { $month = $row['month']; $dayRange = $row['day_range']; $validRanges = ['01-07', '08-14', '15-21', '22-end']; if (!isset($monthlyIntensities[$month]) || !in_array($dayRange, $validRanges)) { continue; } if (!empty($row['intensity'])) { $monthlyIntensities[$month][] = $row['intensity']; } }
这样就能确保只收集你指定的四个区间的数据,然后再计算平均值啦!
内容的提问来源于stack exchange,提问作者nico
相关产品推荐
相关产品推荐

