PHP按条件统计数组元素并在HTML表格展示的问题
PHP按积雪深度区间统计各月数据并生成表格的简洁实现
实现思路
- 统一定义所有需要统计的积雪深度区间,避免重复编写判断逻辑
- 提前初始化1-12月的统计结构,每个月份的每个区间计数初始为0
- 仅遍历一次原始数据数组完成全区间统计,从根源避免重复统计问题
- 动态生成HTML表格,后续修改区间或月份范围无需大幅改动代码
完整代码示例
<?php // 示例原始数据(替换为你的实际数组) $Array = [ ['fMonth' => 1, 'fSnowDepth' => 2], ['fMonth' => 1, 'fSnowDepth' => 4], ['fMonth' => 2, 'fSnowDepth' => 3], ['fMonth' => 2, 'fSnowDepth' => 6], ['fMonth' => 3, 'fSnowDepth' => 0.5], ['fMonth' => 3, 'fSnowDepth' => 2.5], // 可添加更多数据 ]; // 定义积雪深度区间:键为区间显示文本,值为判断深度是否属于该区间的闭包 $depthRanges = [ '<1' => fn($d) => $d < 1, '1≤fSnowDepth<3' => fn($d) => $d >= 1 && $d < 3, '3≤fSnowDepth<5' => fn($d) => $d >= 3 && $d < 5, '≥5' => fn($d) => $d >= 5, ]; // 初始化统计结果:1-12月,每个区间计数初始为0 $stats = []; for ($month = 1; $month <= 12; $month++) { $stats[$month] = array_fill_keys(array_keys($depthRanges), 0); } // 遍历原始数据,统计每个月份各区间的数量 foreach ($Array as $item) { $month = $item['fMonth']; $depth = $item['fSnowDepth']; // 跳过无效月份(如超出1-12的情况) if (!isset($stats[$month])) continue; // 匹配对应深度区间并累加计数 foreach ($depthRanges as $rangeName => $isInRange) { if ($isInRange($depth)) { $stats[$month][$rangeName]++; break; // 每个深度仅属于一个区间,找到后停止匹配 } } } // 输出HTML表格 echo '<table border="1" cellpadding="8" cellspacing="0">'; // 表头 echo '<tr>'; echo '<th>月份</th>'; foreach (array_keys($depthRanges) as $range) { echo "<th>{$range}</th>"; } echo '</tr>'; // 表体:逐行输出每个月的统计数据 foreach ($stats as $month => $counts) { echo '<tr>'; echo "<td>{$month}月</td>"; foreach ($counts as $count) { echo "<td>{$count}</td>"; } echo '</tr>'; } echo '</table>'; ?>
关键细节说明
- 区间灵活调整:新增或修改区间仅需调整
$depthRanges数组,统计逻辑无需改动 - 杜绝重复统计:单次遍历原始数组,每个数据项仅被统计到对应区间,无重复计数问题
- 代码简化:使用PHP 7.4+箭头函数
fn()简化闭包写法,array_fill_keys快速生成初始统计结构,减少冗余代码 - 容错处理:自动跳过无效月份,避免数据异常导致的错误
内容的提问来源于stack exchange,提问作者surban21
相关产品推荐
相关产品推荐

