You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

关键说明

  1. 先计算每个用户数据所需的rowspan值(取Hobi和Keahlian数组长度的最大值)
  2. 循环$rowspan次生成表格行:
    • 仅在第一行($i === 0)输出带rowspan属性的Nama和Umur单元格,这些单元格会自动跨越指定行数
    • 每一行都输出对应索引的Hobi和Keahlian内容,索引超出数组范围时显示空单元格

内容的提问来源于stack exchange,提问作者Crescentia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 19:42:06