PHP或Laravel中如何合并两个异结构数组为指定目标格式
PHP/Laravel 关联异构数组生成目标结构化数据实现方案
需求说明
需要将两个结构不同的输入数组,基于vendor_id做关联匹配,生成逐行对齐的标准化明细数组:
- 输入数组1
$insertData:存储每个供应商对应生成的采购申请ID(prid) - 输入数组2
$requestData:表单提交的垂直结构明细,同索引位置的数值对应同一条商品行 - 目标输出:每条商品行补充匹配对应的prid,形成完整的明细数组
核心实现逻辑
不使用嵌套循环遍历匹配,先建立映射关系再逐行对齐,整体时间复杂度为O(n),远低于嵌套循环的O(n*m)效率:
- 将
$insertData转换为以vendor_id为键的映射表,可通过常数时间查到对应prid - 遍历
$requestData的逐行明细,按索引提取每个字段的值 - 根据当前行的
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
相关产品推荐
相关产品推荐

