通过相同的键合并两个关联数组 [英] Merge two associative arrays by same key

查看:85
本文介绍了通过相同的键合并两个关联数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have two associative array having one value in common, like

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 +个值并且大小不相同.

I would like to merge them both by their ID. A simple merge isn't possible because they arn't sorted, have 40.000 + values and don't have the same size.

我计划使用double foreach,并在ID通用的情况下创建第三个数组,所以我放弃了这个想法.由于必须为第二个数组中的40.000个值分别解析第一个数组中的40.000个值,因此花费了太长的时间.

I planned to use a double foreach, and create a third array were the ID was common, I dropped the idea. Since having to parse 40.000 values in the first array for each of the 40.000 values from the second array take too long.

有什么解决方法吗?我希望最终看起来像这样:

Is there some solution ? I would like to having it look like this at 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"
  }
)

推荐答案

您不可避免地要循环.但是foreach非常快.在50.000的数组上进行测试,耗时0.04秒.

You cannot avoid to loop. But foreach is pretty fast. Tested on an array of 50.000 and it took 0.04 seconds.

这将要做的是:

  • 创建TMP阵列
  • 从ARRAY1获取KEY和ID值
  • 将它们作为TMP阵列中的"ID" =>键
  • 循环ARRAY2,获取ID
  • 在TMP中查找相应的ID
  • 从ARRAY1获取密钥
  • 合并ARRAY1和ARRAY2

您将最终获得具有来自ARRAY2的数据的ARRAY1

You'll end up with ARRAY1 having the data from ARRAY2

$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] );
        }
    }

这篇关于通过相同的键合并两个关联数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆