【问题标题】:merge two arrays based on matching column name [duplicate]根据匹配的列名合并两个数组[重复]
【发布时间】:2023-03-24 03:15:01
【问题描述】:

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

数组1:

[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
    )

数组2:

[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 循环会按数组的顺序查看数组。

【问题讨论】:

  • 研究使用类似array_column($array2, null, 'order_id') 的东西按订单ID 索引第二个数组,然后使用foreach()。它可能与被索引的其他数组一起工作得更好,但试试吧。

标签: php arrays


【解决方案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
                )

        )

)

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

【讨论】:

  • 请考虑将您的答案转移到欺骗页面。
  • 尼克已将他的答案转移到副本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
  • 2019-09-06
  • 1970-01-01
  • 2020-08-12
  • 2019-06-28
  • 2022-01-27
  • 2016-05-30
相关资源
最近更新 更多