PHP数组按指定portfolio分类表格展示问题求助
问题:修正PHP代码以生成指定分类表格
我有一个多维数组,需要生成包含6种portfolio分类(A、B、C、E、IE、IB)的表格,每行对应一个portfolio,每列对应一个分类,单元格显示对应分类的value(值为0时显示"-"),最后一行是各分类的总计。我编写的PHP循环代码生成的表格不符合预期,现附相关信息请求修正:
数组结构
$chart1 = [ [ 'portfolio' => '*0047', 's_c' => 'A', 'value' => 50488 ], [ 'portfolio' => '*0217', 's_c' => 'A', 'value' => 44256 ], // 其余数组内容省略 ];
错误代码
<?php foreach ($chart1 as $da) { ?> <tr> <td><?php echo $da['portfolio'];?></td> <td><?php if($da['s_c'] == "C" && $da['s_c'] == "C"){ echo ($da['value'] == 0)? "-":number_format($da['value']); $cash_totle += $da['value']; } ?></td> <td><?php if($da['s_c'] == "E" && $da['s_c'] == "e"){ echo ($da['value'] == 0)? "-":number_format($da['value']); $us_enquity_totle += $da['value']; } ?></td> <!-- 其余代码内容省略 --> </tr> <?php } ?>
目标表格说明
目标表格样式为:
- 表头包含「Portfolio」及6个分类(A、B、C、E、IE、IB)
- 每行对应一个唯一的portfolio,各分类列显示该portfolio对应分类的数值(值为0时显示"-")
- 最后一行显示每个分类的总计数值
修正方案
问题分析
原代码存在以下问题:
- 每遍历一条数组就生成一行,导致同一个portfolio会被拆分成多行(同一portfolio的不同分类记录会生成单独行)
- 条件判断冗余且错误(如
$da['s_c'] == "C" && $da['s_c'] == "C"完全重复,$da['s_c'] == "E" && $da['s_c'] == "e"大小写判断逻辑矛盾) - 未对portfolio进行分组,无法将同一portfolio的所有分类值整合到同一行
修正代码
1. 先对数组按portfolio分组并计算总计
// 按portfolio分组,整理每个portfolio下各分类的数值 $groupedData = []; // 初始化各分类总计 $categoryTotals = ['A' => 0, 'B' => 0, 'C' => 0, 'E' => 0, 'IE' => 0, 'IB' => 0]; foreach ($chart1 as $item) { $portfolio = $item['portfolio']; $category = $item['s_c']; $value = $item['value']; // 初始化当前portfolio的所有分类值为0 if (!isset($groupedData[$portfolio])) { $groupedData[$portfolio] = ['A' => 0, 'B' => 0, 'C' => 0, 'E' => 0, 'IE' => 0, 'IB' => 0]; } // 为当前分类赋值,并累加总计 $groupedData[$portfolio][$category] = $value; $categoryTotals[$category] += $value; }
2. 生成符合要求的表格
?> <table border="1" cellpadding="8" cellspacing="0"> <thead> <tr> <th>Portfolio</th> <th>A</th> <th>B</th> <th>C</th> <th>E</th> <th>IE</th> <th>IB</th> </tr> </thead> <tbody> <?php foreach ($groupedData as $portfolio => $categoryValues): ?> <tr> <td><?php echo htmlspecialchars($portfolio); ?></td> <?php foreach (['A', 'B', 'C', 'E', 'IE', 'IB'] as $category): ?> <td><?php echo $categoryValues[$category] == 0 ? '-' : number_format($categoryValues[$category]); ?></td> <?php endforeach; ?> </tr> <?php endforeach; ?> <!-- 总计行 --> <tr style="font-weight: bold;"> <td>总计</td> <?php foreach (['A', 'B', 'C', 'E', 'IE', 'IB'] as $category): ?> <td><?php echo number_format($categoryTotals[$category]); ?></td> <?php endforeach; ?> </tr> </tbody> </table> <?php
修正说明
- 先分组:将同一portfolio的所有分类数据整合到一个数组中,确保每行对应一个唯一的portfolio
- 简化判断:直接遍历预设的分类列表,避免冗余或错误的条件判断
- 统一值处理:统一处理数值显示逻辑,0显示"-",非0值格式化输出
- 正确计算总计:遍历数组时同步累加各分类的总计值,最后生成总计行
内容的提问来源于stack exchange,提问作者Gagan
相关产品推荐
相关产品推荐

