PHP渲染HTML表格时合并相同Mob值行单元格的实现方法
PHP结合PDO实现Bootstrap掉落表同怪物编号单元格跨行合并
核心实现逻辑
- 原查询语句必须追加
ORDER BY Mob排序,保证相同怪物编号的记录在结果集中连续排列,否则合并会出现排版错乱 - 先遍历一次全量结果集,统计每个怪物编号对应的掉落记录总条数,作为单元格
rowspan属性的值 - 遍历渲染表格行时,记录上一次已经渲染过的怪物编号,仅当遍历到新的怪物编号时,才输出带跨行属性的怪物编号单元格,同组后续行直接跳过该列的输出即可
可直接复用的代码示例
<?php // 沿用你现有PDO连接配置即可,无需修改原有连接逻辑 $pdo = new PDO('你的数据库连接DSN', '数据库账号', '数据库密码', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ ]); // 修改原查询语句,增加Mob字段排序 $stmt = $pdo->query("SELECT * FROM drop_default ORDER BY Mob ASC"); $dropData = $stmt->fetchAll(); // 预统计每个Mob对应的记录行数 $mobSpanMap = []; foreach ($dropData as $row) { $mobSpanMap[$row->Mob] = isset($mobSpanMap[$row->Mob]) ? $mobSpanMap[$row->Mob] + 1 : 1; } // 初始化标记,记录上一次渲染过的Mob值 $lastMob = null; ?> <!-- Bootstrap表格结构,可直接适配你原有样式 --> <table class="table table-bordered table-hover"> <thead class="table-light"> <tr> <th>Mob(怪物编号)</th> <th>Item(物品编号)</th> <th>Count(掉落数量)</th> <th>Drop Chance(掉落概率)</th> </tr> </thead> <tbody> <?php foreach ($dropData as $drop): ?> <tr> <?php if ($drop->Mob !== $lastMob): ?> <td rowspan="<?= $mobSpanMap[$drop->Mob] ?>"><?= htmlspecialchars($drop->Mob) ?></td> <?php $lastMob = $drop->Mob; ?> <?php endif; ?> <td><?= htmlspecialchars($drop->Item) ?></td> <td><?= htmlspecialchars($drop->Count) ?></td> <td><?= htmlspecialchars($drop->DropChance) // 字段名请和你实际表结构保持一致 ?></td> </tr> <?php endforeach; ?> </tbody> </table>
注意事项
- 所有从数据库读取输出到HTML的内容,必须用
htmlspecialchars()做转义处理,避免XSS安全漏洞 - 不需要给同组非首行输出空的
<td>占位,rowspan属性会自动让单元格占据对应行数,手动输出空td反而会导致表格列数错位 - 如果需要叠加其他排序规则(比如按掉落概率从高到低排),直接在
ORDER BY后追加规则即可,只要保证相同Mob的记录连续就不会影响合并效果 - 如果结果集为空,可以在遍历前加判断输出“暂无掉落数据”的提示行,避免表格空态异常
内容的提问来源于stack exchange,提问作者George Zeimpekis
相关产品推荐
相关产品推荐

