2011-04-21 29 views
2

我現在有兩個數組,在每個關鍵是產品ID,而值是數量:PHP的附加價值,以現有的數組值

$array_1 = ([10] => 1, [13] => 3, [27] => 1, [32] => 2); 
$array_2 = ([8] => 1, [10] => 1, [12] => 1, [20] => 2, [27] => 1); 

我想這兩個陣列相結合,但加值一起在鑰匙匹配。有沒有一種方法可以不通過數組遍歷?

+2

總之,沒有。你將不得不迭代。 PHP的內部合併函數只在合併時檢查衝突,但不會對所有值進行合併。 – 2011-04-21 20:17:34

回答

4

以下是我對將兩個數組合並在一起的最短途徑的看法。可能有一個我不知道的內置函數,但它會將兩個數組合併到$array_1中。

foreach($array_1 as $k => $v) 
    foreach($array_2 as $i => $j) 
     if($k == $i) { 
      $array_1[$k] = $v + $j; 
      break; 
     } 

EDIT-break找到了。

編輯 - (感謝KC)

foreach($array_1 as $k => $v) 
    if(isset($array_2[$k])) { 
     $array_1[$k] += $array_2[$k]; 
     unset($array_2[$k]); 
    } 

foreach($array_2 as $k => $v) 
    $array_1[$k] = $v; 
+1

'n * m'在最壞的情況下?($ array_1 as $ k => $ v){if(isset($ array_2 [$ key])){/ * add * /} else {/ * not add * /}'是什麼?感覺效率更高。您可以取消已經找到的'$ array_2'中的鍵。剩下的'$ array_2'是「未觸動過的鍵」 – KingCrunch 2011-04-21 20:29:43

+0

由於我的問題的答案是'不',我已經拿出上面KC的建議。 – 2011-04-21 20:44:00

+0

我坐正確的:) – 2011-04-21 21:06:43

1

「不反覆」 沒有。即使你包裝他們進入的功能,如array_map其迭代(其不僅沒有在代碼本身可見;))

$result = array_merge_recursive($array_1, $array_2); 

獨特的關鍵,這將離開它,因爲它是。在兩個相同的鍵上,它將兩個值合併成一個數組。在PHP5.3

$result = array_map (function ($item) { 
    return is_array($item) 
    ? $item[0] + $item[1] 
    : $item; 
}, $result); 

一個很好的解決方案的非5.3的解決方案是不是醜也

foreach ($result as &$item) { 
    if (is_array($item)) $item = $item[0] + $item[1]; 
} 

更新:

如果我現在看你的問題,我懷疑,我才明白你的意思是「一起添加數值」。真正添加產品ID和數量並沒有多大意義。但是,只需將上面的+替換爲需要的操作即可:)

3

PHP本地數組函數提供了幾種拆分和組合數組的方法,但不能添加(array_sum並不真正幫助) 。

所以雖然我們在建議您特別沒有要求的解決方案,這裏有一個較短的一個:

foreach ($array_2 as $i=>$k) { 
    $array_1[$i] += $k; 
} 
0

這是功能:採取

 
<?php 
    function merge($array1, $array2) 
    { 

     if(sizeof($array1)>sizeof($array2)) 
     { 
      echo $size = sizeof($array1); 
     }else{ 
      $a = $array1; 
      $array1 = $array2; 
      $array2 = $a; 

      echo $size = sizeof($array1); 
     } 

     $keys2 = array_keys($array2); 

     for($i = 0;$i<$size;$i++) 
     { 
      $array1[$keys2[$i]] = $array1[$keys2[$i]] + $array2[$keys2[$i]]; 
     } 

     $array1 = array_filter($array1); 
     return $array1; 
    } 

?> 

Here
和在我看來,這是最完美的解決方案。

+0

這假設,相應的鍵_really_存在於_both_數組中。 – KingCrunch 2011-04-21 20:32:34

0

您可以使用內置的數組合並函數。 (數組1,數組2,數組3);

這裏使用陣列的名字是你怎麼做 array_merge($array_1 , $array_1);