如何在PHP矩阵表中添加总计行及计算列平均值
如何在PHP生成的降雨矩阵表中添加列总计(及后续平均值计算)
嘿,我来帮你搞定这个列求和的问题,顺便给你铺垫好后续计算平均值的路子~
首先,你的核心需求是给每个月份列计算总计,我们可以在读取数据库数据的阶段就同步累加每个月的总和,这样效率最高,不用后续再遍历整个$data数组二次计算。
步骤1:初始化总和数组并累加数据
在你的while循环读取数据时,新增一个$monthTotals数组来存储每个月的降雨量总和,每次读取到一条数据就对应累加到对应月份:
// 初始化一个数组,用来存储每个月的降雨量总和 $monthTotals = []; while($row = odbc_fetch_array($rs)){ $Station = $row['StationCode']; $Year = $row['Year']; $Day = $row['Day']; $Month = $row['Month']; $rainfallValue = $row['D_Rainfall']; $data[$Day][$Month] = $rainfallValue; $montharray[] = $row['Month']; // 关键:累加当月的降雨量总和 if(!isset($monthTotals[$Month])){ $monthTotals[$Month] = 0.0; // 如果是该月第一条数据,先初始化为0 } $monthTotals[$Month] += $rainfallValue; } // 别忘了给月份数组去重(移到循环外更合理) $montharray = array_unique($montharray); // 可选:给月份排序,保证从1到12的顺序 sort($montharray);
步骤2:输出总计行
在你输出完所有日期行之后,遍历去重后的月份数组,从$monthTotals中取出对应月份的总和,格式化输出(和你的示例一致保留1位小数):
echo '<table class="table table-bordered table-condensed">'; echo '<thead>'; echo '<tr>'; echo '<th>Day</th>'; foreach($montharray as $name){ echo '<th>' . $name . '</th>'; // 输出月份表头 } echo '</tr>'; echo '</thead>'; echo '<tbody>'; // 先输出所有日期的行(你的原有代码优化版) foreach($data as $day=>$rainfall){ echo '<tr>'; echo '<th>'. $day .'</th>'; foreach($montharray as $name){ $D_rainfall = isset($rainfall[$name]) ? number_format($rainfall[$name], 1) : '0.0'; echo '<td>' . $D_rainfall . '</td>'; } echo '</tr>'; } // 新增:输出总计行 echo '<tr>'; echo '<th>Total</th>'; foreach($montharray as $name){ // 取出对应月份的总和,无数据则显示0.0,保留1位小数 $total = isset($monthTotals[$name]) ? number_format($monthTotals[$name], 1) : '0.0'; echo '<td>' . $total . '</td>'; } echo '</tr>'; echo '</tbody>'; echo '</table>';
后续扩展:计算列平均值
如果要计算每个月的平均降雨量,只需要基于已有的$monthTotals和总天数来计算即可:
- 先确定总天数:如果是按数据中存在的天数,用
$totalDays = count($data);;如果是当月实际天数,可以用PHP的cal_days_in_month函数。 - 在总计行之后新增平均值行:
// 输出平均值行 echo '<tr>'; echo '<th>Average</th>'; foreach($montharray as $name){ $total = isset($monthTotals[$name]) ? $monthTotals[$name] : 0.0; $average = $total / $totalDays; // 保留1位小数 echo '<td>' . number_format($average, 1) . '</td>'; } echo '</tr>';
小提示:修复原有代码的小问题
- HTML类名写错了:
table table bordered应该改成table table-bordered table-condensed(连字符不能丢) - 原代码中输出总计行的部分有语法错误(多了一个
}),上面的代码已经修正
这样修改后,就能完美实现你想要的总计行效果,后续扩展平均值也非常方便~
内容的提问来源于stack exchange,提问作者JL Tan
相关产品推荐
相关产品推荐

