如何基于三个PHP公司数据数组生成指定格式的矩阵报表?
需求:生成矩阵式财务报表
我有三个存储公司财务数据的PHP数组:
$companyX = [ 0 => [ 2 => 'company X', 107 => 'Accounts receivable', 2000 => 'Provider A', 'amount' => 2 ], 1 => [ 2 => 'company X', 107 => 'Accounts receivable', 4123 => 'Provider F', 'amount' => 5 ], 2 => [ 2 => 'company X', 205 => 'Accounts payable', 2000 => 'Provider A', 'amount' => 2 ], 3 => [ 2 => 'company X', 205 => 'Accounts payable', 4123 => 'Provider F', 'amount' => 7 ], 4 => [ 2 => 'company X', 603 => 'Sales', 2011 => 'Provider G', 'amount' => 9 ] ]; $companyY = [ 0 => [ 5 => 'company Y', 107 => 'Accounts receivable', 2000 => 'Provider A', 'amount' => 15 ], 1 => [ 5 => 'company Y', 107 => 'Accounts receivable', 4123 => 'Provider F', 'amount' => 21 ], 2 => [ 5 => 'company Y', 205 => 'Accounts payable', 2000 => 'Provider A', 'amount' => 36 ], 3 => [ 5 => 'company Y', 205 => 'Accounts payable', 4123 => 'Provider F', 'amount' => 47 ], 4 => [ 5 => 'company Y', 701 => 'Costs', 6360 => 'Provider K', 'amount' => 14 ] ]; $companyZ = [ 0 => [ 8 => 'company Z', 107 => 'Accounts receivable', 2000 => 'Provider A', 'amount' => 51 ], 1 => [ 8 => 'company Z', 107 => 'Accounts receivable', 4123 => 'Provider F', 'amount' => 63 ], 2 => [ 8 => 'company Z', 205 => 'Accounts payable', 2000 => 'Provider A', 'amount' => 74 ], 3 => [ 8 => 'company Z', 205 => 'Accounts payable', 4123 => 'Provider F', 'amount' => 83 ] ];
我需要生成矩阵式报表(按公司、科目分组,横向展示供应商及对应金额),但当前合并数组后循环输出的代码:
$group = [...$companyX, ...$companyY, ...$companyZ ]; ?> <table class="table"> <tr> <td>Company</td> <td>Account</td> <td>Provider</td> <td>Amount</td> </tr> <?php foreach ($group as $key => $detail) : ?> <tr> <?php foreach ($detail as $dt) : ?> <td><?php echo $dt; ?></td> <?php endforeach; ?> </tr> <?php endforeach; ?> </table>
只能生成列表式报表:
Company Account Provider Amount company X Accounts receivable Provider A 2 company X Accounts receivable Provider F 5 company X Accounts payable Provider A 2 company X Accounts payable Provider F 7 company X Sales Provider G 9 company Y Accounts receivable Provider A 15 company Y Accounts receivable Provider F 21 company Y Accounts payable Provider A 36 company Y Accounts payable Provider F 47 company Y Costs Provider K 14 company Z Accounts receivable Provider A 51 company Z Accounts receivable Provider F 63 company Z Accounts payable Provider A 74 company Z Accounts payable Provider F 83
请指导如何实现矩阵式报表。
解决方案:数据重组+矩阵表格生成
要实现矩阵式报表,核心是先将原始数据按公司-科目维度分组,提取所有供应商作为横向表头,再按分组填充对应金额。
步骤1:标准化数据并重组分组
先统一数据字段的提取逻辑,再按公司和科目分组存储供应商与金额的对应关系:
// 标准化数据格式并按公司-科目分组 function groupFinancialData($companies) { $grouped = []; foreach ($companies as $companyData) { foreach ($companyData as $item) { // 提取核心字段:公司名、科目名、供应商名、金额 $companyName = current(array_filter($item, fn($k) => is_numeric($k) && !in_array($k, [107,2000,4123,2011,6360]), ARRAY_FILTER_USE_KEY)); $accountName = $item[107] ?? ($item[205] ?? ($item[603] ?? $item[701])); $providerName = current(array_filter($item, fn($k) => in_array($k, [2000,4123,2011,6360]), ARRAY_FILTER_USE_KEY)); $amount = $item['amount']; // 按"公司|科目"作为分组键 $groupKey = "{$companyName}|{$accountName}"; if (!isset($grouped[$groupKey])) { $grouped[$groupKey] = [ 'company' => $companyName, 'account' => $accountName, 'providers' => [] ]; } $grouped[$groupKey]['providers'][$providerName] = $amount; } } return $grouped; } // 合并所有公司数据并完成分组 $allCompanies = [$companyX, $companyY, $companyZ]; $groupedData = groupFinancialData($allCompanies); // 提取所有唯一供应商作为横向表头 $allProviders = []; foreach ($groupedData as $item) { $allProviders = array_merge($allProviders, array_keys($item['providers'])); } $allProviders = array_unique($allProviders); sort($allProviders);
步骤2:生成矩阵式HTML表格
基于重组后的数据和供应商表头,生成带合并单元格的矩阵表格:
?> <table class="table" border="1"> <!-- 双层表头 --> <tr> <th rowspan="2">Company</th> <th rowspan="2">Account</th> <th colspan="<?php echo count($allProviders); ?>">Providers & Amounts</th> </tr> <tr> <?php foreach ($allProviders as $provider) : ?> <th><?php echo $provider; ?></th> <?php endforeach; ?> </tr> <!-- 数据行 --> <?php foreach ($groupedData as $item) : ?> <tr> <td><?php echo $item['company']; ?></td> <td><?php echo $item['account']; ?></td> <?php foreach ($allProviders as $provider) : ?> <td><?php echo isset($item['providers'][$provider]) ? $item['providers'][$provider] : '-'; ?></td> <?php endforeach; ?> </tr> <?php endforeach; ?> </table>
最终效果
生成的矩阵报表结构如下:
| Company | Account | Provider A | Provider F | Provider G | Provider K |
|---|---|---|---|---|---|
| company X | Accounts receivable | 2 | 5 | - | - |
| company X | Accounts payable | 2 | 7 | - | - |
| company X | Sales | - | - | 9 | - |
| company Y | Accounts receivable | 15 | 21 | - | - |
| company Y | Accounts payable | 36 | 47 | - | - |
| company Y | Costs | - | - | - | 14 |
| company Z | Accounts receivable | 51 | 63 | - | - |
| company Z | Accounts payable | 74 | 83 | - | - |
内容的提问来源于stack exchange,提问作者Jorch Cab
相关产品推荐
相关产品推荐

