【问题标题】:merge array and increase int value when key match in php?php中键匹配时合并数组并增加int值?
【发布时间】:2014-12-13 04:18:57
【问题描述】:

如何合并两个数组,并在键匹配时增加值? 两个数组可能包含另一个数组中不存在的键,并且它们都可能比另一个具有更多或更少的键。

所以我不能只取一个数组,然后循环遍历该数组并与另一个数组进行比较,因为有时“其他”数组可能具有更多值。这会不时切换。

数组合并似乎也不起作用,因为它会覆盖旧值。

我需要从两个数组中返回所有唯一键,但是每当一个键匹配时,我只需将两个值相加即可。

Array_a:

["BMW-B2"]=>int(1)
["BMW-N-115 "]=>int(5)
["BMW-N-143"]=>int(3)
["BMW-N-163"]=>int(10)
["BMW-N-184"]=>int(4)

Array_b

["CR220036"]=>int(3)
["BMW-N-163"]=>int(9)
["CR220822"]=>int(7)

Array_merged

["BMW-B2"]=>int(1)
["CR220036"]=>int(3)
["CR220822"]=>int(7)
["BMW-N-115 "]=>int(5)
["BMW-N-143"]=>int(3)
["BMW-N-163"]=>int(19)  //  <--  this has increast by 9
["BMW-N-184"]=>int(4)

顺序并不重要。

【问题讨论】:

  • 写出最简单的输入、输出和你想要的结果的例子,或者 - 甚至更好 - 一个单元测试,你会让包括你自己在内的每个人的生活更轻松
  • 欧凯。我添加了两个数组的示例,以及我需要的输出

标签: php arrays merge


【解决方案1】:

这个怎么样:

$arr1=array(1,2,3,4);
$arr2=array(1,2,5=>1);
$result=array();
foreach($arr1 as $k=>$v){
    $result[$k]=$v;
    if(isset($arr2[$k])){
        $result[$k]+=$arr2[$k];
    }
}
foreach($arr2 as $k=>$v){
   if(!isset($result[$k]){
      $result[$k]=$v;
   }
}
var_dump($result);

【讨论】:

    【解决方案2】:

    您可以通过使用循环 and 并合并数组来实现此目的。基本上,您选择一个要检查重复值的数组,执行算术运算,unset 不再需要的数组元素,然后将它们合并在一起。

    考虑修改您的代码,类似于以下内容:

    $array1 = array("val1" => 5, "val2" => 8, "val3" => 10, "val4" => 2, "val5" => 12);
    $array2 = array("val3" => 9, "val6" => 11, "val1" => 15);
    
    foreach ($array2 as $key => $value)
    {
        if (array_key_exists($key, $array1))
        {
            $array1[$key] += $value;
            unset($array2[$key]);
        }
    }
    
    $merged = array_merge($array1, $array2);
    
    var_dump($merged);
    
    //Output:
    array(6) {
      ["val1"]=>
      int(20)
      ["val2"]=>
      int(8)
      ["val3"]=>
      int(19)
      ["val4"]=>
      int(2)
      ["val5"]=>
      int(12)
      ["val6"]=>
      int(11)
    }
    

    在我的示例中,$array2 中的所有值都与$array1 进行比较,以定位重复键并按存储的值递增。如果发现了一个骗子,则该元素未设置,这将防止$array1 中的修改键在array_merge() 操作中被覆盖。

    【讨论】:

    • 谢谢。我会在星期一看看,然后告诉你:)
    猜你喜欢
    • 2018-11-27
    • 2013-08-07
    • 1970-01-01
    • 2013-02-24
    • 2016-08-02
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 2017-11-26
    相关资源
    最近更新 更多