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

如何基于共享键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)

步骤说明

  1. 将第二个数组转换为以Mark值为键的关联数组,快速匹配查找,降低时间复杂度;
  2. 遍历第一个数组,对每个元素:
    • 检查转换后的关联数组中是否存在相同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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 00:29:51