PHP合并不同长度数组:按PurchaseOrderId与VendorId分组关联SubLineItem
问题解决思路
你原有代码的核心问题是使用了双层循环遍历两个数组,时间复杂度为O(M*N),数据量大时性能极低,且会产生笛卡尔积导致匹配错误,同时无键追加数组的写法会生成多余的数字索引,不符合预期结构。
由于$arr_filtered_po本身以PurchaseOrderId为索引,直接通过键查找即可实现O(1)的匹配效率,整体时间复杂度可降至O(M)(M为子行项数量),适配大数据量场景。
实现代码
// 初始化结果数组 $arr_qbo = []; // 仅需遍历子行项数组,PO数据通过主键直接查找 foreach ($arr_sublineitems as $subLineItem) { $poId = $subLineItem['PurchaseOrderId']; $vendorId = $subLineItem['VendorId']; $subLineId = $subLineItem['SubLineItemId']; // 跳过无对应PO记录的异常子行项 if (!isset($arr_filtered_po[$poId])) { continue; } // 提取关联的PONumber $poNumber = $arr_filtered_po[$poId]['PONumber']; // 构造子行项最终数据 $processedItem = $subLineItem; unset($processedItem['PurchaseOrderId'], $processedItem['SubLineItemId'], $processedItem['VendorId']); $processedItem['PONumber'] = $poNumber; // 按要求层级写入结果数组 $arr_qbo[$poId][$vendorId][$subLineId] = $processedItem; }
生成的数组结构
[ '23c03079-d06e-4c5e-bebc-bfcdbfeea635' => [ // 外层键为PurchaseOrderId '24d84b89-ef9a-4347-95c0-d282fcf19b58' => [ // 第二层键为VendorId 'e2a1b308-8895-41ce-9688-878c13b00c14' => [ // 第三层键为SubLineItemId 'Quantity' => 40, 'SellPrice' => 131, 'FreightSell' => 0, 'NetPrice' => 121.8375, 'FreightNet' => 0, 'Taxable' => true, 'ProjectId' => '827c879c-8dd6-4738-85f8-c14da2c743b8', 'Total_Sell' => 5240, 'PONumber' => '1211111-20' ], // 同PO同Vendor下的其他子行项 ], // 同PO下的其他Vendor分组 ], // 其他PurchaseOrderId分组 ]
内容的提问来源于stack exchange,提问作者startingout
相关产品推荐
相关产品推荐

