首页 > 解决方案 > 通过相同的键合并两个关联数组

问题描述

我有两个具有一个共同值的关联数组,例如

ARRAY 1(
  [0]=>
  array(2) {
    ["ID"]=> "AAAA"
    ["Name"]=> "Apple"
  }
  [1]=>
  array(2) {
    ["ID"]=> "BBBB"
    ["Name"]=> "Avocado"
  }
  [3]=>
  array(2) {
    ["ID"]=> "CCCC"
    ["Name"]=> "Banana"
  }
)



Array2 (
  [0]=>
  array(4) {
    ["ID"]=> "AAAA"
    ["Taste"]=> "Yumi"
    ["Location"]=> "France"
    ["Price"]=> "Cheap"
  }
  [1]=>
  array(4) {
    ["ID"]=> "CCCC"
    ["Taste"]=> "Yumi"
    ["Location"]=> "Africa"
    ["Price"]=> "Cheap"
  }
  [3]=>
  array(4) {
    ["ID"]=> "BBBB"
    ["Taste"]=> "Yumi"
    ["Location"]=> "America"
    ["Price"]=> "Expansive"
  }
  [3]=>
  array(4) {
    ["ID"]=> "HZGA"
    ["Taste"]=> "Berk"
    ["Location"]=> "Moon"
    ["Price"]=> "Expansive"
  }    

)

我想通过他们的 ID 合并它们。简单的合并是不可能的,因为它们没有排序,有 40.000 + 值并且没有相同的大小。

我计划使用双 foreach,并在 ID 很常见的情况下创建第三个数组,我放弃了这个想法。由于必须为第二个数组中的 40.000 个值中的每一个解析第一个数组中的 40.000 个值需要太长时间。

有什么解决办法吗?我想让它在 final 看起来像这样:

ArrayFinal (
  [0]=>
  array(4) {
    ["ID"]=> "AAAA"
    ["Name"]=> "Apple"
    ["Taste"]=> "Yumi"
    ["Location"]=> "France"
    ["Price"]=> "Cheap"
  }
  [1]=>
  array(4) {
    ["ID"]=> "CCCC"
    ["Name"]=> "Banana"
    ["Taste"]=> "Yumi"
    ["Location"]=> "Africa"
    ["Price"]=> "Cheap"
  }
  [3]=>
  array(4) {
    ["ID"]=> "BBBB"
    ["Name"]=> "Avocado"
    ["Taste"]=> "Yumi"
    ["Location"]=> "America"
    ["Price"]=> "Expansive"
  }
)

标签: phpassociative-array

解决方案


你无法避免循环。但是 foreach 非常快。在 50.000 的数组上进行了测试,耗时 0.04 秒。

这将做的是:

  • 创建一个 TMP 数组
  • 从 ARRAY1 获取 KEY 和 ID 值
  • 将它们作为 'ID'=>key 放在 TMP 数组中
  • 循环ARRAY2,获取ID
  • 在TMP中查找对应的ID
  • 从 ARRAY1 获取密钥
  • 合并 ARRAY1 和 ARRAY2

您最终会得到来自 ARRAY2 的数据的 ARRAY1

$ar1=[...]; //original array 1
$ar2=[...]; //original array 2

// get ID=> key pairs
$kv=[];
foreach($ar1 as $k => $v){
    $kv[ $v['id'] ] = $k;
    }

// loop ARRAY2
foreach($ar2 as $k => $v){
    if( array_key_exists( $v['id'] , $kv ) ){
        $ar1[ $kv[$v['id']] ] = array_merge( $ar1[$kv[$v['id']]] , $ar2[$k] );
        }
    }

推荐阅读