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

PHP中按多条件对多维数组SubLineItems分维度聚合统计问题

实现方案

先修正你之前代码的核心问题:数组键使用混乱、未提前初始化统计字段导致调用不存在的键报错、累加时引用了源数据不存在的字段。下面是可直接运行的实现,一次遍历同时完成供应商、采购单两个维度的聚合需求:

1. 聚合逻辑代码

// 初始化供应商维度聚合数组
$vendorStats = [];
// 初始化采购单维度聚合数组
$poStats = [];

foreach ($arr_sublineitems as $item) {
    $vendorId = $item['VendorId'];
    $poId = $item['PurchaseOrderId'];
    $totalSell = $item['Total_Sell'];
    $isTaxable = $item['Taxable'];
    $freightSell = $item['FreightSell'];

    // 供应商维度初始化,不存在则默认所有统计字段为0
    if (!isset($vendorStats[$vendorId])) {
        $vendorStats[$vendorId] = [
            'total_taxable' => 0, // 应税正金额
            'total_nontaxable' => 0, // 非应税正金额
            'credit_taxable' => 0, // 应税负金额(退款)
            'credit_nontaxable' => 0, // 非应税负金额(退款)
            'freight_sell' => 0
        ];
    }
    // 采购单维度初始化
    if (!isset($poStats[$poId])) {
        $poStats[$poId] = [
            'total_taxable' => 0,
            'total_nontaxable' => 0,
            'credit_taxable' => 0,
            'credit_nontaxable' => 0,
            'freight_sell' => 0
        ];
    }

    // 匹配条件累加,每个条目只会命中一个分支,不需要额外加break/continue
    if ($totalSell > 0) {
        if ($isTaxable) {
            $vendorStats[$vendorId]['total_taxable'] += $totalSell;
            $poStats[$poId]['total_taxable'] += $totalSell;
        } else {
            $vendorStats[$vendorId]['total_nontaxable'] += $totalSell;
            $poStats[$poId]['total_nontaxable'] += $totalSell;
        }
        $vendorStats[$vendorId]['freight_sell'] += $freightSell;
        $poStats[$poId]['freight_sell'] += $freightSell;
    } elseif ($totalSell < 0) {
        if ($isTaxable) {
            $vendorStats[$vendorId]['credit_taxable'] += $totalSell;
            $poStats[$poId]['credit_taxable'] += $totalSell;
        } else {
            $vendorStats[$vendorId]['credit_nontaxable'] += $totalSell;
            $poStats[$poId]['credit_nontaxable'] += $totalSell;
        }
    }
}

2. 拆分独立数组(可选)

如果需要你要求的四个独立数组,从聚合结果中提取即可,以应税正金额数组为例:

$arr_sublineitem_taxable = [];
foreach ($vendorStats as $vendorId => $stat) {
    if ($stat['total_taxable'] > 0) {
        $arr_sublineitem_taxable[$vendorId] = [
            'FreightSell' => $stat['freight_sell'],
            'Total_Sell' => $stat['total_taxable']
        ];
    }
}

其余三个数组按相同逻辑筛选对应字段即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:15:04