如何合并数组中相同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
相关产品推荐
相关产品推荐

