【问题标题】:foreach loop and array_merge not matching correctlyforeach 循环和 array_merge 不正确匹配
【发布时间】:2021-01-28 09:39:24
【问题描述】:

我有以下两个数组,我试图将它们合并到一个找到共同 order_id 的数组中:

$orders 数组:

[0] => Array (
    [order_id] => 45145
    [customers_email_address] => test@test.com
    [customers_name] => test name
    )
[1] => Array (
    [order_id] => 45136
    [customers_email_address] => test@yahoo.com
    [customers_name] => test name
    )
[2] => Array (
    [order_id] => 45117
    [customers_email_address] => test@yahoo.com
    [customers_name] => test name
    )
[3] => Array (
    [order_id] => 44959
    [customers_email_address] => test@gmail.com
    [customers_name] => test name
    )
[4] => Array (
    [order_id] => 44938
    [customers_email_address] => test@hotmail.com
    [customers_name] => t
    )

$chitchattracking 数组:

[1] => Array (
    [order_id] => 44938
    [carrier_tracking_code] => 9205590221582717655498
    )
[2] => Array (
    [order_id] => 44854
    [carrier_tracking_code] => 92055902215827
    )

在上面的数组样本中有一个匹配的order_id:44938

这是我正在检查匹配项的代码,并将其放入新数组 $tracked:

foreach ($orders as $order) {
    if (($key = array_search($order['order_id'], array_column($chitchattracking, 'order_id'))) !== false) {
        $tracked[] = array_merge( $order, $chitchattracking[$key]);
    }
}

不知何故,我真的搞砸了,它匹配了错误的 order_ids 并发布了不正确的跟踪号。此外,当我运行这个有限数量的代码时,它甚至找不到匹配项。

【问题讨论】:

  • 你的$chitchattracking数组中没有0键吗?

标签: php arrays for-loop array-merge


【解决方案1】:

几乎可以肯定,您的问题是由array_column 返回一个从 0 开始进行数字索引的数组引起的,无论输入数组的键是多少。因此,如果输入数组也不是从 0 开始的数字索引,array_search 返回的键不一定与输入数组中的键匹配(这就是为什么您的代码根本无法使用问题中的示例数据运行)。解决此问题的最简单方法是通过order_id 重新索引$chitchattracking,然后您可以执行简单的isset 检查来控制对$tracking 的推送:

$tracking = array();
$chitchat = array_column($chitchattracking, null, 'order_id');
foreach ($orders as $order) {
    $order_id = $order['order_id'];
    if (isset($chitchat[$order_id])) {
        $tracking[] = array_merge($order, $chitchat[$order_id]);
    }
}
print_r($tracking);

输出:

Array
(
    [0] => Array
        (
            [order_id] => 44938
            [customers_email_address] => test@hotmail.com
            [customers_name] => t
            [carrier_tracking_code] => 9.2055902215827E+21
        )
)

Demo on 3v4l.org

【讨论】:

  • 非常感谢您指出我很沮丧我没有意识到数组不是从 0 开始的。该数组是从某个 json 生成的,我试图弄清楚为什么它不从 0 开始0.
  • 我找到了原因,感谢您指出这一点并让我选择重新索引!
  • @Sackling 很酷 - 这是一个奖励。请注意,即使修复了索引,此代码也将比您在问题中发布的代码快得多,因为它只调用一次 array_column 并且没有调用 array_search (这比慢得多键查找)。
猜你喜欢
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 2017-11-24
  • 2015-07-13
  • 2012-04-07
  • 2015-07-01
  • 2021-08-24
  • 1970-01-01
相关资源
最近更新 更多