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

如何基于三个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>

最终效果

生成的矩阵报表结构如下:

CompanyAccountProvider AProvider FProvider GProvider K
company XAccounts receivable25--
company XAccounts payable27--
company XSales--9-
company YAccounts receivable1521--
company YAccounts payable3647--
company YCosts---14
company ZAccounts receivable5163--
company ZAccounts payable7483--

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 20:25:53