PHP如何按generation字段分组多维数组生成对应HTML表格行
问题说明
现有一个已按generation(世代)字段完成升序排序的PHP数组,结构如下:
Array ( [0] => Array ( [userID] => 1 [userName] => Grandfather [generation] => 1 ) [1] => Array ( [userID] => 2 [userName] => Father [generation] => 2 ) [2] => Array ( [userID] => 3 [userName] => Son [generation] => 3 ) [3] => Array ( [userID] => 4 [userName] => Daughter [generation] => 3 ) )
需要基于该数组生成HTML表格,规则为:
- 每个世代单独占据一行
- 同一世代下的所有成员用户名之间用逗号分隔
原有实现代码仅能输出每个世代的第一个成员,无法满足需求,原有代码如下:
echo '<table>'; $x = 1; foreach ($usersArray as $subArray){ if($subArray['generation'] == $x){ echo '<tr>'; echo '<td>'.$subArray['userName'].'</td>'; echo '</tr>'; } $x++; } echo '</table>';
错误原因
原有代码存在两个核心问题:
- 计数器
$x每次循环都会自增,和实际世代值无法匹配:例如遍历到第二个世代值为3的成员时,$x已经累加为4,判断条件不成立,自然不会输出该成员 - 匹配到对应世代时直接输出整行结构,没有提前收集同世代的所有用户名,因此只能拿到每个世代遍历到的第一个成员
正确实现代码
由于数组已经提前按世代升序排序,不需要额外做复杂的分组处理,只需在遍历过程中临时缓存当前世代的用户名集合,碰到世代值切换时输出上一世代的表格行即可,实现代码如下:
echo '<table border="1" cellpadding="8" cellspacing="0">'; // 初始化临时变量:记录当前处理的世代、同世代用户名列表 $currentGeneration = null; $userNames = []; foreach ($usersArray as $user) { // 切换到新世代时,先把上一个世代的整行内容输出 if ($currentGeneration !== null && $user['generation'] != $currentGeneration) { echo '<tr>'; echo '<td>世代 ' . $currentGeneration . '</td>'; echo '<td>' . implode(', ', $userNames) . '</td>'; echo '</tr>'; // 重置用户名列表,用于收集新世代的成员 $userNames = []; } // 更新当前世代标记,将当前用户名加入列表 $currentGeneration = $user['generation']; $userNames[] = $user['userName']; } // 循环结束后必须补充输出最后一个世代的行,否则最后一组数据会丢失 if ($currentGeneration !== null) { echo '<tr>'; echo '<td>世代 ' . $currentGeneration . '</td>'; echo '<td>' . implode(', ', $userNames) . '</td>'; echo '</tr>'; } echo '</table>';
实现说明
- 使用
implode(', ', $userNames)可以直接将同世代的用户名用逗号拼接,不需要手动处理末尾多余的逗号 - 遍历结束后补充输出最后一组数据是分组遍历逻辑的常见注意点,否则最后一个世代的所有成员都不会被渲染到表格中
- 如果需要调整表格样式,直接修改
<table>标签的属性、或者添加对应class定义CSS即可
内容的提问来源于stack exchange,提问作者DivFellaPoor
相关产品推荐
相关产品推荐

