PHP - 合并两个关联数组,其中值匹配

4

我可以帮忙翻译。这篇文章涉及到IT技术,需要合并两个数组。作者想知道是否有现成的函数可以帮助实现这个功能,而不是手动循环遍历每个数组。

数组1:

Array
(
[0] => Array
    (
        [detail_image_id] => 6389
        [product_name] => Starter broadband Package
    )

[1] => Array
    (
        [detail_image_id] => 6358
        [product_name] => Starter broadband Package
    )
)

数组 2:

Array
(
[0] => Array
    (
        [detail_image_id] => 6358
        [guid] => http://xxx/wp-content/uploads/2018/04/broadband-4mbs-wingle.jpg
    )

[1] => Array
    (
        [detail_image_id] => 6389
        [guid] => http://xxx/wp-content/uploads/2018/04/broadband-4mbs-charji.jpg
    )
)

期望的输出数组为:
Array
(
[0] => Array
    (
        [detail_image_id] => 6389
        [product_name] => Starter broadband Package
        [guid] => http://xxx/wp-content/uploads/2018/04/broadband-4mbs-charji.jpg
    )

[1] => Array
    (
        [detail_image_id] => 6358
        [product_name] => Starter broadband Package
        [guid] => http://xxx/wp-content/uploads/2018/04/broadband-4mbs-wingle.jpg
    )
)

我只添加了一个示例数组。这个数组非常大。有没有类似 array_merge() 或者 array_map() 的PHP函数,可以替代手动使用for循环和迭代器呢?


也许可以使用array_merge_recursive或者array_replace_recursive - Michel
3个回答

4

经过多年的经验积累,我已经改变了以前的建议,不再推荐使用这种技术。最简洁和高效的方法是将数组合并,将它们传递给foreach()循环,然后在相关行中使用 "联合" (+作为数组联合运算符) 数据。

空合并运算符(??)用于确保始终有东西与之相“联合”。

代码:(演示)

$result = [];
foreach (array_merge($array1, $array2) as $row) {
    $result[$row['detail_image_id']] = ($result[$row['detail_image_id']] ?? []) + $row;
}

var_export(array_values($result));

输出:

array (
  0 => 
  array (
    'detail_image_id' => '6389',
    'product_name' => 'Starter broadband Package',
    'guid' => 'http://xxx/wp-content/uploads/2018/04/broadband-4mbs-charji.jpg',
  ),
  1 => 
  array (
    'detail_image_id' => '6358',
    'product_name' => 'Starter broadband Package',
    'guid' => 'http://xxx/wp-content/uploads/2018/04/broadband-4mbs-wingle.jpg',
  ),
)

太好了,这很干净简单。 - levi

3
您可以这样做:
$arr1 = array(); //Your array 1
$arr2 = array(); //Your array 2

//Make a temp array to that use detail_image_id as the key
$arr1Temp = array_combine( array_column($arr1,'detail_image_id'), $arr1 );
$arr2Temp = array_combine( array_column($arr2,'detail_image_id'), $arr2 );

//Get All unique detail_image_id from 2 arrays. 
//This is to make sure that all detail_image_id's will be included. 
//detail_image_id on 2nd array might not be present on the 1st one
$imgIds = array_unique(array_merge( array_keys($arr1Temp), array_keys($arr2Temp) ));

//Do a simple foreach loop
$result = array();
foreach( $imgIds as $val ) {
    $result[] = array_merge( $arr1Temp[$val], $arr2Temp[$val] );
}

print_r( $result );

这会导致如下结果:
Array
(
    [0] => Array
        (
            [detail_image_id] => 6389
            [product_name] => Starter broadband Package
            [guid] => http://xxx/wp-content/uploads/2018/04/broadband-4mbs-charji.jpg
        )

    [1] => Array
        (
            [detail_image_id] => 6358
            [product_name] => Starter broadband Package
            [guid] => http://xxx/wp-content/uploads/2018/04/broadband-4mbs-wingle.jpg
        )

)

1
将来使用时,请在您的技巧库中添加array_column()和第二个参数为null--这是一个非常方便的函数。 - mickmackusa
1
@mickmackusa 我之前不知道这个。谢谢你。 - Eddie
不错的解决方案,看起来非常高效! - funder7

3
您可以使用 array_column()array_combine() 的组合来创建一个以 detail_image_id 作为键的引用数组。然后,通过 foreach() 循环,您可以使用 + 运算符 合并数组:
$array1 = [
    ['detail_image_id' => '6389', 'product_name' => 'Starter broadband Package'],
    ['detail_image_id' => '6358', 'product_name' => 'Starter broadband Package']
];
$array2 = [
    ['detail_image_id' => '6358', 'guid' => 'http://xxx/wp-content/uploads/2018/04/broadband-4mbs-wingle.jpg'],
    ['detail_image_id' => '6389', 'guid' => 'http://xxx/wp-content/uploads/2018/04/broadband-4mbs-charji.jpg']
];

// create associative array with detail_image_id as key,
$out = array_combine(array_column($array1, 'detail_image_id'), $array1);
foreach ($array2 as $item) {
    $key = $item['detail_image_id']; // shortcut for the key,
    $out[$key] = $out[$key] + $item; // merge arrays
}
print_r(array_values($out)); // reset to indexed keys (0,1,2...) 

输出:

Array
(
    [0] => Array
        (
            [detail_image_id] => 6389
            [product_name] => Starter broadband Package
            [guid] => http://xxx/wp-content/uploads/2018/04/broadband-4mbs-charji.jpg
        )

    [1] => Array
        (
            [detail_image_id] => 6358
            [product_name] => Starter broadband Package
            [guid] => http://xxx/wp-content/uploads/2018/04/broadband-4mbs-wingle.jpg
        )

)

将来使用时,请在您的技巧库中添加array_column()和第二个参数为null--这是一个非常方便的函数。 - mickmackusa
您的答案有一种可能的弱点,它正在迭代array2,而array1可能有更多的值(这些值将在结果中被静默地省略)。Eddie已经将此考虑进了他的答案中。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接