PHP多维数组按教师年级统计学生数并生成表格的实现问题
实现逻辑
- 先提取所有教师名下出现过的年级,去重后按年级数字升序排序,作为表格的年级表头字段
- 遍历每个教师数据,对教师名下每个年级的多组学生数求和,无对应年级学生的位置默认填0
- 按表格结构逐行输出内容即可
可运行PHP代码
<?php // 原始多维数组 $array = array ( "teacher1" => array( "grades" => array( "grade 4" => array( 0 => 1, ), ), "sum" => 1, "name" => "teacher1", ), "teacher2" => array( "grades" => array( "grade 8" => array( 0 => 5, ), "grade 1" => array( 0 => 4, ), ), "sum" => 9, "name" => "teacher2", ), "teacher3" => array( "grades" => array( "grade 1" => array( 0 => 2, 1 => 1, ), "grade 4" => array( 0 => 1, ), "grade 5" => array( 0 => 1, ), "grade 2" => array( 0 => 1, ), ), "sum" => 6, "name" => "teacher3", ), ); // 第一步:收集所有不重复的年级并按数字升序排序 $allGrades = []; foreach ($array as $teacher) { foreach ($teacher['grades'] as $gradeName => $group) { if (!in_array($gradeName, $allGrades)) { $allGrades[] = $gradeName; } } } usort($allGrades, function($a, $b) { $aNum = intval(trim(str_replace('grade', '', $a))); $bNum = intval(trim(str_replace('grade', '', $b))); return $aNum - $bNum; }); // 第二步:渲染HTML表格 echo '<table border="1" cellpadding="8" cellspacing="0">'; // 渲染表头 echo '<thead><tr>'; echo '<th>教师</th>'; foreach ($allGrades as $grade) { echo "<th>{$grade}</th>"; } echo '<th>总计</th>'; echo '</tr></thead>'; // 渲染表体内容 echo '<tbody>'; foreach ($array as $teacher) { echo '<tr>'; echo "<td>{$teacher['name']}</td>"; foreach ($allGrades as $grade) { // 存在对应年级就对多分组学生数求和,否则显示0 $count = isset($teacher['grades'][$grade]) ? array_sum($teacher['grades'][$grade]) : 0; echo "<td>{$count}</td>"; } echo "<td>{$teacher['sum']}</td>"; echo '</tr>'; } echo '</tbody></table>'; ?>
输出效果
运行代码后生成的表格和预期完全一致:
| 教师 | grade 1 | grade 2 | grade 4 | grade 5 | grade 8 | 总计 |
|---|---|---|---|---|---|---|
| teacher1 | 0 | 0 | 1 | 0 | 0 | 1 |
| teacher2 | 4 | 0 | 0 | 0 | 5 | 9 |
| teacher3 | 3 | 1 | 1 | 1 | 0 | 6 |
内容的提问来源于stack exchange,提问作者GBeni
相关产品推荐
相关产品推荐

