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

如何用PHP从关联数组生成带rowspan的HTML表格?

PHP程序化生成带rowspan的层级表格

问题背景

我有如下关联数组:

$regions = [
    'Germany' => [
        'Channels' => [
            'Google Ads',
            'LinkedIn Ads',
            'E-Mail-Marketing'
        ],
        'Tools' => [
            'CRM'
        ]
    ],
    'USA' => [
        'SalesTools' => [
            'Pipedrive',
            'Salesforce'
        ]
    ]
];

希望渲染成带rowspan的HTML表格:

<table>
    <tr>
        <th>Region</th>
        <th>Costcenter</th>
        <th>Costcenter_item</th>
    </tr>
    <tr>
        <td rowspan='4'>Germany</td>
        <td rowspan='3'>Channels</td>
        <td>Google Ads</td>
    </tr>
    <tr>
        <td>LinkedIn Ads</td>
    </tr>
    <tr>
        <td>E-Mail-Marketing</td>
    </tr>
    <tr>
        <td rowspan='1'>Tools</td>
        <td>CRM</td>
    </tr>
    <tr>
        <td rowspan='2'>USA</td>
        <td rowspan='2'>SalesTools</td>
        <td>Pipedrive</td>
    </tr>
    <tr>
        <td>Salesforce</td>
    </tr>
</table>

但我在计算rowspan的正确数值时遇到困难,尝试回溯数组统计叶子节点但未成功,请问如何用PHP程序化构建该HTML表格并获取正确的rowspan值?


解决方案

核心逻辑:每个层级单元格的rowspan值等于其下所有叶子节点的总数。比如Germany的rowspan是3+1=4,Channels的rowspan是3,Tools的rowspan是1,以此类推。

实现代码

<?php
$regions = [
    'Germany' => [
        'Channels' => ['Google Ads', 'LinkedIn Ads', 'E-Mail-Marketing'],
        'Tools' => ['CRM']
    ],
    'USA' => [
        'SalesTools' => ['Pipedrive', 'Salesforce']
    ]
];

// 递归统计节点下的叶子总数
function countLeafNodes($array) {
    $count = 0;
    foreach ($array as $item) {
        if (is_array($item)) {
            $count += countLeafNodes($item);
        } else {
            $count++;
        }
    }
    return $count;
}

// 生成表格
echo "<table border='1'>";
// 输出表头
echo "<tr><th>Region</th><th>Costcenter</th><th>Costcenter_item</th></tr>";

foreach ($regions as $regionName => $costCenters) {
    // 计算当前地区的rowspan:所有下属成本中心的叶子总数之和
    $regionRowspan = countLeafNodes($costCenters);
    $isFirstCostCenter = true;

    foreach ($costCenters as $costCenterName => $items) {
        // 计算当前成本中心的rowspan:自身下属叶子总数
        $ccRowspan = countLeafNodes($items);
        $isFirstItem = true;

        foreach ($items as $item) {
            echo "<tr>";
            // 仅在第一个成本中心的第一个子项中输出地区单元格
            if ($isFirstCostCenter && $isFirstItem) {
                echo "<td rowspan='$regionRowspan'>$regionName</td>";
            }
            // 仅在当前成本中心的第一个子项中输出成本中心单元格
            if ($isFirstItem) {
                echo "<td rowspan='$ccRowspan'>$costCenterName</td>";
            }
            echo "<td>$item</td>";
            echo "</tr>";
            $isFirstItem = false;
        }
        $isFirstCostCenter = false;
    }
}
echo "</table>";
?>

代码说明

  1. 递归统计叶子节点:countLeafNodes函数遍历数组,若子元素是数组则递归统计,否则计数+1,最终返回该节点下所有叶子的总数,这个数值就是对应单元格的rowspan值。
  2. 表格生成逻辑:
    • 遍历每个地区,先计算该地区的总rowspan(所有下属叶子数)。
    • 遍历每个成本中心,计算其rowspan(自身下属叶子数)。
    • 遍历每个子项,仅在第一个子项中输出带rowspan的地区和成本中心单元格,后续子项只输出最后一列内容,利用rowspan属性自动跨越多行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:36:22