【问题标题】:Merge two associative arrays by same key通过相同的键合并两个关联数组
【发布时间】:2018-05-29 14:34:44
【问题描述】:

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

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 个值需要太长时间。

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

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"
  }
)

【问题讨论】:

    标签: php associative-array


    【解决方案1】:

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

    这样做的目的是:

    • 创建一个 TMP 数组
    • 从 ARRAY1 获取 KEY 和 ID 值
    • 将它们作为 'ID'=>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] );
            }
        }
    

    【讨论】:

    • 非常感谢。有了你的回答,我可以只保留我的第一个数组长度,与第二个数组值合并,而不必在 foreach 中执行 foreach,这就是杀死我的原因。
    • 非常好!我觉得最后的$ar2[$k]可以换成$k。你怎么看? ($v 已经是$ar2[$k],不过后者更清楚)
    • @funder7 是的,你可以。那时甚至没有注意到。
    【解决方案2】:

    https://eval.in/1011901

     <?php 
    
    $a = [['ID'=> 'TOTO'], ['ID' => 'TATA']];
    $b = [['ID' => 'TATA', 'RA' => 'T'], ['ID' => 'TOTO', 'COUCOU' => 2]];
    
    $final = [];
    
    foreach($a as $c){
      if(!isset($final[$c['ID']])){
        $final[$c['ID']] = $c;
      }else{
        $final[$c['ID']] += $c;
      }
    }
    foreach($b as $c){
      if(!isset($final[$c['ID']])){
        $final[$c['ID']] = $c;
      }else{
        $final[$c['ID']] += $c;
      }
    }
    var_dump(array_values($final));
    

    输出

    array(2) {
      [0]=>
      array(2) {
        ["ID"]=>
        string(4) "TOTO"
        ["COUCOU"]=>
        int(2)
      }
      [1]=>
      array(2) {
        ["ID"]=>
        string(4) "TATA"
        ["RA"]=>
        string(1) "T"
      }
    }
    

    【讨论】:

    • 谢谢!它非常接近我的需要!
    猜你喜欢
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 2012-02-25
    • 2019-06-04
    • 2015-09-23
    • 2010-11-15
    • 2018-09-02
    相关资源
    最近更新 更多