根据匹配的列名合并两个数组

时间:2020-10-11 19:06:56

标签: php arrays

我正在尝试根据匹配的order_id合并两个数组:

Array1:

[0] => Array (
    [order_id] => 44446
    [carrier_tracking_code] => LB399189926US
    )
[1] => Array (
    [order_id] => 42816
    [carrier_tracking_code] => 9205590221582717353066
    )
[2] => Array (
    [order_id] => 44490
    [carrier_tracking_code] => 9205590221582717353080
    )
[3] => Array (
    [order_id] => 44507
    [carrier_tracking_code] => 9205590221582717353073
    )
[4] => Array (
    [order_id] => 44437
    [carrier_tracking_code] => 9205590221582717353042
    )
[5] => Array (
    [order_id] => 44519
    [carrier_tracking_code] => 9205590221582717352939
    )
[6] => Array (
    [order_id] => 44561
    [carrier_tracking_code] => 9205590221582717353028
    )
[7] => Array (
    [order_id] => 42985
    [carrier_tracking_code] => 9205590221582717353035
    )
[8] => Array (
    [order_id] => 42673
    [carrier_tracking_code] => 9205590221582717353097
    )
[9] => Array (
    [order_id] => 40197
    [carrier_tracking_code] => 9205590221582717353059
    )
[10] => Array (
    [order_id] => 44733
    [carrier_tracking_code] => 92055902215827
    )

array2:

[79] => Array (
    [order_id] => 44925
    [customers_email_address] => test@test.com
    [customers_name] => JTest name
    )
[80] => Array (
    [order_id] => 44923
    [customers_email_address] =>  test@test.com
    [customers_name] => Test name
    )
[81] => Array (
    [order_id] => 44917
    [customers_email_address] =>  test@test.com
    [customers_name] => Test name
    )
[82] => Array (
    [order_id] => 44915
    [customers_email_address] => a test@test.com
    [customers_name] => Test name
    )

我的目标是创建第三个与两者的order_id列匹配的数组,并基于该数组进行合并。

我尝试了array_merge和array_merge_recursive等,但是那些只是将值添加到数组的末尾,我试图将它们合并到同一数组键中。

我认为我需要一个foreach循环,该循环检查是否第二个命令是否order_id = order_id,以及是否确实将项目推送到第三个数组。但是我的问题是数组不是按order_id排序的,因此它们可能永远不会相同,因为如果可行,foreach循环将按照数组的顺序遍历数组。

1 个答案:

答案 0 :(得分:-1)

获取用于维护该索引的order_id的客户索引,即:

Array
(
    [79] => 44925
    [80] => 44923
    [81] => 44917
    [82] => 44915
)

然后简单地循环,并使用order_id进行数组搜索以返回客户商品,然后添加到数组中。

例如:(请注意,order_ids中没有一个与您的示例中的客户匹配,因此已更改)

<?php
$orders = [
    ['order_id' => 44925, 'carrier_tracking_code' => 'LB399189926US'],
    ['order_id' => 44923, 'carrier_tracking_code' => '9205590221582717353066'],
    ['order_id' => 44490, 'carrier_tracking_code' => '9205590221582717353080'],
];

$customers = [
    79 => ['order_id' => 44490, 'customers_email_address' => 'test@test.com', 'customers_name' => 'JTest name'],
    80 => ['order_id' => 44923, 'customers_email_address' => ' test@test.com', 'customers_name' => 'Test name'],
    81 => ['order_id' => 44925, 'customers_email_address' => ' test@test.com', 'customers_name' => 'Test name']
];

$customer_index = array_combine(array_keys($customers), array_column($customers, 'order_id'));

$result = [];

foreach ($orders as $key => $order) {
    $result[$key] = $order;
    
    $customer = array_search($order['order_id'], $customer_index);
    $result[$key]['customer'] = $customer ? $customers[$customer] : [];
}

print_r($result);

https://3v4l.org/TLYSI

结果:

Array
(
    [0] => Array
        (
            [order_id] => 44925
            [carrier_tracking_code] => LB399189926US
            [customer] => Array
                (
                    [order_id] => 44925
                    [customers_email_address] =>  test@test.com
                    [customers_name] => Test name
                )

        )

    [1] => Array
        (
            [order_id] => 44923
            [carrier_tracking_code] => 9205590221582717353066
            [customer] => Array
                (
                    [order_id] => 44923
                    [customers_email_address] =>  test@test.com
                    [customers_name] => Test name
                )

        )

    [2] => Array
        (
            [order_id] => 44490
            [carrier_tracking_code] => 9205590221582717353080
            [customer] => Array
                (
                    [order_id] => 44490
                    [customers_email_address] => test@test.com
                    [customers_name] => JTest name
                )

        )

)

理想情况下,由于内存问题,您不会在运行时将所有客户选择到一个阵列中,而是通过数据库查询来完成。