PHP实现带Rowspan的动态HTML表格解决方案求助
求助:实现带Rowspan的动态HTML表格(PHP+HTML)
需要实现带Rowspan的动态HTML表格效果,当前在为父行添加Rowspan属性时遇到阻碍。以下是我的PHP数据源数组及已尝试的脚本代码,恳请提供技术帮助。
PHP数据源数组
<?php // 数据库数据 $data = [ [ 'nama' => 'Asyah', 'hobi' => ['Bola', 'Voly', 'Renang'], 'umur' => '10 Tahun', 'keahlian' => ['Bernyanyi', 'Menari'] ], [ 'nama' => 'Rian', 'hobi' => ['Bola'], 'umur' => '10 Tahun', 'keahlian' => ['Main musik', 'Menari'] ], [ 'nama' => 'Boby', 'hobi' => ['Basket', 'Voly'], 'umur' => '10 Tahun', 'keahlian' => ['Bernyanyi', 'Menari', 'Coding'] ] ]; ?>
已尝试的脚本代码
<?php // 计算Rowspan数量的函数 function getRowspan($data) { $total = 0; foreach ($data as $item) { $total += max(count($item['hobi']), count($item['keahlian'])); } return $total; } ?> <table border="1"> <thead> <tr> <th>Nama</th> <th>Hobi</th> <th>Umur</th> <th>Keahlian</th> </tr> </thead> <tbody> <?php foreach ($data as $item): ?> <?php $rowspan = max(count($item['hobi']), count($item['keahlian'])); ?> <tr> <td rowspan="<?php echo $rowspan; ?>"><?php echo $item['nama']; ?></td> <td><?php echo implode('</td></tr><tr><td>', $item['hobi']); ?></td> <td rowspan="<?php echo $rowspan; ?>"><?php echo $item['umur']; ?></td> <td><?php echo implode('</td></tr><tr><td>', $item['keahlian']); ?></td> </tr> <?php for ($i = 1; $i < $rowspan; $i++): ?> <tr> <td><?php echo isset($item['hobi'][$i]) ? $item['hobi'][$i] : ''; ?></td> <td><?php echo isset($item['keahlian'][$i]) ? $item['keahlian'][$i] : ''; ?></td> </tr> <?php endfor; ?> <?php endforeach; ?> </tbody> </table>
问题分析与修正方案
原代码的核心问题是用implode('</td></tr><tr><td>', $item['hobi'])直接拆分列表,破坏了表格结构——Nama和Umur的rowspan已经占据对应行数,不需要额外生成<tr>标签。正确逻辑是循环每一行,仅在第一行输出带rowspan的Nama和Umur,后续行仅填充对应位置的Hobi和Keahlian内容。
修正后的代码如下:
<?php // 数据库数据 $data = [ [ 'nama' => 'Asyah', 'hobi' => ['Bola', 'Voly', 'Renang'], 'umur' => '10 Tahun', 'keahlian' => ['Bernyanyi', 'Menari'] ], [ 'nama' => 'Rian', 'hobi' => ['Bola'], 'umur' => '10 Tahun', 'keahlian' => ['Main musik', 'Menari'] ], [ 'nama' => 'Boby', 'hobi' => ['Basket', 'Voly'], 'umur' => '10 Tahun', 'keahlian' => ['Bernyanyi', 'Menari', 'Coding'] ] ]; ?> <table border="1"> <thead> <tr> <th>Nama</th> <th>Hobi</th> <th>Umur</th> <th>Keahlian</th> </tr> </thead> <tbody> <?php foreach ($data as $item): ?> <?php $rowspan = max(count($item['hobi']), count($item['keahlian'])); // 循环生成对应行数的表格行 for ($i = 0; $i < $rowspan; $i++): ?> <tr> <?php if ($i === 0): ?> <!-- 仅第一行输出带rowspan的Nama单元格 --> <td rowspan="<?php echo $rowspan; ?>"><?php echo $item['nama']; ?></td> <?php endif; ?> <!-- 输出当前行的Hobi,无内容则留空 --> <td><?php echo isset($item['hobi'][$i]) ? $item['hobi'][$i] : ''; ?></td> <?php if ($i === 0): ?> <!-- 仅第一行输出带rowspan的Umur单元格 --> <td rowspan="<?php echo $rowspan; ?>"><?php echo $item['umur']; ?></td> <?php endif; ?> <!-- 输出当前行的Keahlian,无内容则留空 --> <td><?php echo isset($item['keahlian'][$i]) ? $item['keahlian'][$i] : ''; ?></td> </tr> <?php endfor; ?> <?php endforeach; ?> </tbody> </table>
关键说明
- 先计算每个用户数据所需的rowspan值(取Hobi和Keahlian数组长度的最大值)
- 循环
$rowspan次生成表格行:- 仅在第一行(
$i === 0)输出带rowspan属性的Nama和Umur单元格,这些单元格会自动跨越指定行数 - 每一行都输出对应索引的Hobi和Keahlian内容,索引超出数组范围时显示空单元格
- 仅在第一行(
内容的提问来源于stack exchange,提问作者Crescentia
相关产品推荐
相关产品推荐

