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

如何合并数组中相同NAMA_MDS值实现带rowspan的合并单元格销售表格

方案1:不修改原数组直接实现(最简便)

无需调整原数组结构,仅需修改视图层代码即可实现效果,原理是提前统计每个销售人员的行数,遍历时判断是否为该销售的第一条数据,是则添加rowspan属性,否则不渲染销售人员单元格即可。
注意:需保证原数据是按NAMA_MDS排序的,同个销售人员的行是连续的,若查询结果未排序,在SQL语句中添加ORDER BY NAMA_MDS即可。
修改后的视图层代码:

<tbody>
<?php
// 先拿到所有行数据,统计每个销售对应的行数
$rows = $report2->result_array();
$salesRowCount = array_count_values(array_column($rows, 'NAMA_MDS'));
$renderedSales = []; // 记录已经渲染过的销售,避免重复输出
foreach($rows as $row):
    $Call = $row['Call'];
    $vsc = ceil(($row['EC']*100)/$Call);
    $RO = $row['RO'];
    $vsr = ceil(($row['OT']*100)/$RO);
?>
<tr>
    <?php if(!isset($renderedSales[$row['NAMA_MDS']])): ?>
        <!-- 第一次出现该销售,添加rowspan属性 -->
        <td rowspan="<?=$salesRowCount[$row['NAMA_MDS']]?>"><?=$row['NAMA_MDS']?></td>
        <?php $renderedSales[$row['NAMA_MDS']] = true; ?>
    <?php endif; ?>
    <td><small><?=$row['NAMA_SGRUP']?></small></td>
    <td><?=$row['EC']?></td>
    <td><?php if($vsc >= 100){echo '100%';}else{echo $vsc.'%';}?></td>
    <td><?=$row['OT']?></td>
    <td><?php if($vsr >= 100){echo '100%';}else{echo $vsr.'%';}?></td>
    <td><?=$row['Ratio']?></td>
    <td><?=number_format($row['SBQ'])?></td>
    <td><?=ceil($row['SBQ']/$row['EC'])?></td>
    <td><?=ceil($row['SBQ']/$row['OT'])?></td>
</tr>
<?php endforeach; ?>
</tbody>

方案2:先重组数组结构(适合需要扩展统计的场景)

你的思路是正确的,按NAMA_MDS分组存储数据,逻辑更清晰,也方便后续针对单个销售人员做汇总统计。

第一步:修改控制器代码,重组数组

public function test(){
    $data['db_default'] =  $this->db_default->default();
    $originData = $this->m_report->table2($data['db_default'][0]['databasename'])->result_array();
    // 按销售名称分组重组数组
    $groupedReport = [];
    foreach($originData as $row){
        $groupedReport[$row['NAMA_MDS']][] = $row;
    }
    $data['grouped_report2'] = $groupedReport;
    $data['content'] = 'tempelates/BKL/Report_B';
    $this->load->view('Tempelate',$data);
}

第二步:修改视图层代码

<tbody>
<?php foreach($grouped_report2 as $salesName => $productList): 
    $rowspan = count($productList); // 该销售对应的行数,就是rowspan的值
    foreach($productList as $index => $row):
        $Call = $row['Call'];
        $vsc = ceil(($row['EC']*100)/$Call);
        $RO = $row['RO'];
        $vsr = ceil(($row['OT']*100)/$RO);
?>
<tr>
    <?php if($index === 0): // 仅该销售的第一行渲染名称单元格 ?>
        <td rowspan="<?=$rowspan?>"><?=$salesName?></td>
    <?php endif; ?>
    <td><small><?=$row['NAMA_SGRUP']?></small></td>
    <td><?=$row['EC']?></td>
    <td><?php if($vsc >= 100){echo '100%';}else{echo $vsc.'%';}?></td>
    <td><?=$row['OT']?></td>
    <td><?php if($vsr >= 100){echo '100%';}else{echo $vsr.'%';}?></td>
    <td><?=$row['Ratio']?></td>
    <td><?=number_format($row['SBQ'])?></td>
    <td><?=ceil($row['SBQ']/$row['EC'])?></td>
    <td><?=ceil($row['SBQ']/$row['OT'])?></td>
</tr>
<?php endforeach; endforeach; ?>
</tbody>

两种方案都可以实现需求,如果仅需要单元格合并效果,选第一种更快捷;如果后续需要做销售维度的汇总统计,选第二种更便于扩展。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:48:02