如何用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>"; ?>
代码说明
- 递归统计叶子节点:
countLeafNodes函数遍历数组,若子元素是数组则递归统计,否则计数+1,最终返回该节点下所有叶子的总数,这个数值就是对应单元格的rowspan值。 - 表格生成逻辑:
- 遍历每个地区,先计算该地区的总rowspan(所有下属叶子数)。
- 遍历每个成本中心,计算其rowspan(自身下属叶子数)。
- 遍历每个子项,仅在第一个子项中输出带rowspan的地区和成本中心单元格,后续子项只输出最后一列内容,利用rowspan属性自动跨越多行。
内容的提问来源于stack exchange,提问作者sladda
相关产品推荐
相关产品推荐

