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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:45:04