2017-06-30 137 views
1

我想按条件合并数组。如果数组键匹配,则添加值,否则保留该值。如何合并两个数组并总结重复键的值?

这里是我的数组:

Array1 
( 
    [1] => 199 
    [3] => 1306 
    [5] => 199 
) 

Array2 
( 
    [3] => 199 
    [4] => 199 
) 

我期望的结果是:

Result 
( 
    [1] => 199 
    [3] => 1505 
    [4] => 199 
    [5] => 199  
) 

我用的if-else条件,但它的重复这已经是匹配的值。

这里是我的编码尝试:

$all=array(); 
foreach($sall as $sskey => $ssvalue){ 
    foreach($upgradesall as $uukey => $uuvalue){ 
     //$sskey==$uukey?$all[] = array("id"=>$sskey, "amount"=>$ssvalue+$uuvalue):($sskey!=$uukey? $all[] = array("id"=>$sskey, "amount"=>$ssvalue):($uukey!=$sskey?$all[] = array("id"=>$uukey, "amount"=>$uuvalue):'')); 
     if($sskey===$uukey){ 
      $all[] = array("id"=>$sskey, "amount"=>$ssvalue+$uuvalue); 
     }elseif($sskey!=$uukey){ 
      $all[] = array("id"=>$sskey, "amount"=>$ssvalue); 
     }elseif($uukey!=$sskey){ 
      $all[] = array("id"=>$uukey, "amount"=>$uuvalue); 
     } 
    } 
} 
+0

提供您想要的输出。 –

+0

@SAHAR Don'tPanic的方法是您应该使用的最直接,最高效,最精炼的方法。它使用较少的函数调用并避免生成临时多维数组。 – mickmackusa

回答

3

我认为问题比看起来简单。您确实只需要一个条件来排除未定义的偏移量通知。只需迭代两个数组中的所有键和值,并将这些值添加到合并数组中的相应键。

foreach ([$a1, $a2] as $a) {        // iterate both arrays 
    foreach ($a as $key => $value) {      // iterate all keys+values 
     $merged[$key] = $value + ($merged[$key] ?? 0); // merge and add 
    } 
} 

真的,实际执行加法($merged[$key] = $value + ($merged[$key] ?? 0);)线可以减少到$merged[$key] += $value;。这仍然有效,但会产生一堆未定义的偏移量通知。因此,我们可以将键设置为等于该值加上以前的值(如果存在)或零。

如果你还在使用PHP 5中,你可以使用一个三元,而不是空合并运算符(??),像这样:

$merged[$key] = $value + (isset($merged[$key]) ? $merged[$key] : 0); 

输出将不会在显示相同的顺序你想要的结果,但你可以使用ksort($merged);来完成,如接受的答案中所述。

-1

你可以做到这一点通过

$all = array_merge($arr1,$arr2); // existing elements in arr1 are replaced by arr2 else merge into new array_merge 
//then add replaced elememnts value 
foreach($arr1 as $k=>$v) 
{ 
    if(array_key_exists($k,$all)) 
    { 
     $all[$k] = $all[$k] + $v; 
    } 
} 
+0

将给出数组([0] => 199 [1] => 1505 [2] => 199 [3] => 1505 [4] => 199) – sumit

+0

是您的数组关联还是索引数组?此代码适用于关联数组 –

+0

不,因为您已使用array_merge,因此索引不会被保留 – sumit

1

首先,你可以在同一个键合并所有值合并数组:

$allKeys = array_unique(array_merge(array_keys($arr1),array_keys($arr2))); 
$result = []; 
foreach ($allKeys as $key) { 
    $result[$key] = []; 
    if (array_key_exists($key,$arr1)) { 
     $result[$key][] = $arr1[$key]; 
    } 
    if (array_key_exists($key,$arr2)) { 
     $result[$key][] = $arr2[$key]; 
    } 
} 

这将导致:

Array 
(
    [1] => Array 
     (
      [0] => 199 
     ) 

    [3] => Array 
     (
      [0] => 1306 
      [1] => 199 
     ) 

    [5] => Array 
     (
      [0] => 199 
     ) 

    [4] => Array 
     (
      [0] => 199 
     ) 

) 

然后你就可以根据自己的情况把它们映射:

$endResult = array_map('array_sum',$result); 

结果:

Array 
(
    [1] => 199 
    [3] => 1505 
    [5] => 199 
    [4] => 199 
) 

如果你想键进行排序,你可以通过ksort运行它们,以及

查看编号:

http://sandbox.onlinephpfunctions.com/code/3eb23310f0fd8de8174a5caf8b2b91d4b7562b6b

+0

我在某些情况下遇到问题,无法获得理想的结果。 http://sandbox.onlinephpfunctions.com/code/f0c876f693d1dee53ac2afc8d7d102106eb92025 – SAHAR

相关问题