如何基于共享键Mark的值合并两个结构不同的数组
基于共享键Mark合并两个结构不同的数组
需求
将两个结构不同的数组基于共享键Mark的值进行合并,保留第一个数组的全部元素。仅当第二个数组中元素的Mark值与第一个数组中元素的Mark值相同时,将第二个数组对应元素的键值对合并到第一个数组的对应元素中;第二个数组中Mark不匹配的元素直接忽略。
数组示例
第一个数组
Array ( [0] => Array ( [IssueDate] => 2024-01-22 [Mark] => 400001923264133 [Vat301] => 0 [Vat331] => 0 [Vat302] => 0 [Vat332] => 0 [Vat303] => 0 [Vat333] => 0 [Vat304] => 0 [Vat334] => 0 ) [1] => Array ( [IssueDate] => 2024-01-22 [Mark] => 400001923536194 [Vat301] => 0 [Vat331] => 0 [Vat302] => 0 [Vat332] => 0 [Vat303] => 0 [Vat333] => 0 [Vat304] => 0 [Vat334] => 0 ) )
第二个数组
Array ( [0] => Array ( [uid] => 0D7F298912F21E7934380E5728AEF6E31AB74E3F [Mark] => 400001923264133 [vn] => 094019245 [series] => 0 [aa] => 396663852 [name] => string ( [name] => TYPE_2_1 [value] => 2.1 ) [netValue] => 976.15 [vatAmount] => 246.50 [vatCategory] => int ( [name] => VAT_1 [value] => 1 ) ) [1] => Array ( [uid] => 0D7F298912F21E7934380E5728AEF6E31AB74E3F [Mark] => 400001923536194 [vn] => 094019245 [series] => 0 [aa] => 396663852 [name] => string ( [name] => TYPE_2_1 [value] => 2.1 ) [netValue] => 976.15 [vatAmount] => 246.50 [vatCategory] => int ( [name] => VAT_1 [value] => 1 ) ) [2] => Array ( [uid] => 74820E25D29945A74408F64FCBEAE229D4D386FF [Mark] => 400001923801925 [vn] => 094019245 [series] => 0 [aa] => 396663852 [name] => string ( [name] => TYPE_2_1 [value] => 2.1 ) [netValue] => 976.15 [vatAmount] => 246.50 [vatCategory] => int ( [name] => VAT_1 [value] => 1 ) ) [3] => Array ( [uid] => F218FCCF5A12CA067221D4C783ABC52B0A305ACA [Mark] => 400001924018534 [vn] => 094019245 [series] => 0 [aa] => 396663852 [name] => string ( [name] => TYPE_2_1 [value] => 2.1 ) [netValue] => 976.15 [vatAmount] => 246.50 [vatCategory] => int ( [name] => VAT_1 [value] => 1 ) ) )
期望合并结果
Array ( [0] => Array ( [uid] => 0D7F298912F21E7934380E5728AEF6E31AB74E3F [vn] => 094019245 [series] => 0 [aa] => 396663852 [name] => string ( [name] => TYPE_2_1 [value] => 2.1 ) [netValue] => 976.15 [vatAmount] => 246.50 [vatCategory] => int ( [name] => VAT_1 [value] => 1 ) [IssueDate] => 2024-01-22 [Mark] => 400001923264133 [Vat301] => 0 [Vat331] => 0 [Vat302] => 0 [Vat332] => 0 [Vat303] => 0 [Vat333] => 0 [Vat304] => 0 [Vat334] => 0 ) [1] => Array ( [uid] => 0D7F298912F21E7934380E5728AEF6E31AB74E3F [vn] => 094019245 [series] => 0 [aa] => 396663852 [name] => string ( [name] => TYPE_2_1 [value] => 2.1 ) [netValue] => 976.15 [vatAmount] => 246.50 [vatCategory] => int ( [name] => VAT_1 [value] => 1 ) [IssueDate] => 2024-01-22 [Mark] => 400001923536194 [Vat301] => 0 [Vat331] => 0 [Vat302] => 0 [Vat332] => 0 [Vat303] => 0 [Vat333] => 0 [Vat304] => 0 [Vat334] => 0 ) )
实现方案(PHP)
步骤说明
- 将第二个数组转换为以
Mark值为键的关联数组,快速匹配查找,降低时间复杂度; - 遍历第一个数组,对每个元素:
- 检查转换后的关联数组中是否存在相同
Mark值的元素; - 若存在,合并第二个数组元素与当前第一个数组元素(保持第二个数组键值对在前);
- 若不存在,保留第一个数组原有元素。
- 检查转换后的关联数组中是否存在相同
代码实现
// 假设$array1是第一个数组,$array2是第二个数组 $array2ByMark = []; foreach ($array2 as $item) { if (isset($item['Mark'])) { $array2ByMark[$item['Mark']] = $item; } } $result = []; foreach ($array1 as $item) { $mark = $item['Mark']; // 合并数组,第二个数组元素在前,第一个数组元素在后 $mergedItem = isset($array2ByMark[$mark]) ? $array2ByMark[$mark] + $item : $item; $result[] = $mergedItem; } // 输出结果 print_r($result);
说明
- 索引化第二个数组后,匹配操作的时间复杂度从O(n*m)降至O(n+m),效率更高;
- 使用
+运算符合并数组时,相同键名(如Mark)会保留左侧数组(第二个数组)的键值;若需保留两个数组的Mark值,可手动复制该键到合并结果中。
内容的提问来源于stack exchange,提问作者immeckro
相关产品推荐
相关产品推荐

