You need to enable JavaScript to run this app. PHP或Laravel中如何合并两个异结构数组为指定目标格式
优惠活动
大模型
产品
解决方案
定价
更多

PHP或Laravel中如何合并两个异结构数组为指定目标格式

PHP/Laravel 关联异构数组生成目标结构化数据实现方案

需求说明

需要将两个结构不同的输入数组,基于vendor_id做关联匹配,生成逐行对齐的标准化明细数组:

  • 输入数组1 $insertData:存储每个供应商对应生成的采购申请ID(prid)
  • 输入数组2 $requestData:表单提交的垂直结构明细,同索引位置的数值对应同一条商品行
  • 目标输出:每条商品行补充匹配对应的prid,形成完整的明细数组

核心实现逻辑

不使用嵌套循环遍历匹配,先建立映射关系再逐行对齐,整体时间复杂度为O(n),远低于嵌套循环的O(n*m)效率:

  1. 将$insertData转换为以vendor_id为键的映射表,可通过常数时间查到对应prid
  2. 遍历$requestData的逐行明细,按索引提取每个字段的值
  3. 根据当前行的vendor_id从映射表中取对应prid,拼接为完整的明细行存入结果数组

适配现有控制器的代码修改

在原有控制器生成完$insertData、拿到$requestData之后,替换原有打印语句的位置,加入如下拼接逻辑:

// 生成 vendor_id 到 prid 的映射表(利用Laravel集合简化数组处理)
$vendorPridMap = collect($insertData)->keyBy('vendor_id')->toArray();

$targetResult = [];
// 获取明细总长度,逐行遍历
$rowCount = count($requestData['vendor_id']);
for ($i = 0; $i < $rowCount; $i++) {
    $currentVendorId = $requestData['vendor_id'][$i];
    // 从映射表取当前供应商对应的prid
    $currentPrid = $vendorPridMap[$currentVendorId]['prid'] ?? null;
    
    // 拼接完整行数据
    $targetResult[] = [
        'prid' => $currentPrid,
        'vendor_id' => $currentVendorId,
        'item' => $requestData['item'][$i],
        'qty' => $requestData['qty'][$i],
    ];
}

// 最终输出验证
print_r($targetResult);

兼容说明

上述代码执行后生成的$targetResult结构完全匹配预期输出,与测试样例的结果一致。
如果需要兼容纯PHP无集合的场景,将映射表生成部分替换为原生实现即可:

// 纯PHP实现映射表
$vendorPridMap = [];
foreach ($insertData as $item) {
    $vendorPridMap[$item['vendor_id']] = $item;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.11 13:36:04