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

如何在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和总天数来计算即可:

  1. 先确定总天数:如果是按数据中存在的天数,用$totalDays = count($data);;如果是当月实际天数,可以用PHP的cal_days_in_month函数。
  2. 在总计行之后新增平均值行:
// 输出平均值行
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:26:17