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
相关产品推荐
相关产品推荐

