2017-06-30 138 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

相關問題