2010-01-22 135 views
2

確定我有這個功能(我爲這個問題的答案question),其合併的數組,像這樣:PHP:問題合併陣列

功能

function readArray($arr, $k, $default = 0) { 
    return isset($arr[$k]) ? $arr[$k] : $default ; 
} 

function merge($arr1, $arr2) { 
    $result = array() ; 
    foreach($arr1 as $k => $v) { 
     if(is_numeric($v)) { 
      $result[$k] = (int)$v + (int) readArray($arr2, $k) ; 
     } else { 
      $result[$k] = merge($v, readArray($arr2, $k, array())) ; 
     } 
    } 
    return $result ; 
} 

使用

$basketA = array("fruit" => array(), "drink" => array()) ; 
$basketA['fruit']['apple'] = 1; 
$basketA['fruit']['orange'] = 2; 
$basketA['fruit']['banana'] = 3; 
$basketA['drink']['soda'] = 4; 
$basketA['drink']['milk'] = 5; 

$basketB = array("fruit" => array(), "drink" => array()) ; 
$basketB['fruit']['apple'] = 2; 
$basketB['fruit']['orange'] = 2; 
$basketB['fruit']['banana'] = 2; 
$basketB['drink']['soda'] = 2; 
$basketB['drink']['milk'] = 2; 

$basketC = merge($basketA, $basketB) ; 
print_r($basketC) ; 

輸出

Array 
(
    [fruit] => Array 
     (
      [apple] => 3 
      [orange] => 4 
      [banana] => 5 
     ) 

    [drink] => Array 
     (
      [soda] => 6 
      [milk] => 7 
     ) 

) 

確定這一點也適用1個缺陷我無法弄清楚如何解決: 如果$ ARR1是缺少的東西是$ ARR2有,也應該只使用從$ ARR2價值,而是忽略了一起:

$basketA = array("fruit" => array(), "drink" => array()) ; 
$basketA['fruit']['apple'] = 1; 
$basketA['fruit']['orange'] = 2; 
$basketA['fruit']['banana'] = 3; 
$basketA['drink']['milk'] = 5; 

$basketB = array("fruit" => array(), "drink" => array()) ; 
$basketB['fruit']['apple'] = 2; 
$basketB['fruit']['orange'] = 2; 
$basketB['fruit']['banana'] = 2; 
$basketB['drink']['soda'] = 2; 
$basketB['drink']['milk'] = 2; 

$basketC = merge($basketA, $basketB) ; 
print_r($basketC) ; 

輸出
Array 
(
    [fruit] => Array 
     (
      [apple] => 3 
      [orange] => 4 
      [banana] => 5 
     ) 

    [drink] => Array 
     (
      [milk] => 7 
     ) 

) 

通知如何[蘇打]不是新的數組中,因爲第一陣列沒有它。

我該如何解決這個問題?

謝謝!

回答

2

速戰速決,改變merge()功能看起來像這樣:

function merge($arr1, $arr2) { 
    $result = array() ; 
    foreach($arr1 as $k => $v) { 
     if(is_numeric($v)) { 
      $result[$k] = (int)$v + (int) readArray($arr2, $k) ; 
     } else { 
      $result[$k] = merge($v, readArray($arr2, $k, array())) ; 
     } 
    } 
    foreach($arr2 as $k => $v) { 
     if(is_numeric($v)) { 
      $result[$k] = (int)$v + (int) readArray($arr1, $k) ; 
     } else { 
      $result[$k] = merge($v, readArray($arr1, $k, array())) ; 
     } 
    } 
    return $result ; 
} 

輸出:

Array 
(
    [fruit] => Array 
     (
      [apple] => 3 
      [orange] => 4 
      [banana] => 5 
     ) 

    [drink] => Array 
     (
      [soda] => 2 
      [milk] => 7 
     ) 
) 

這也是值得注意的是array_merge_recursive()獨行幾乎相同:

$basketC = array_merge_recursive($basketA, $basketB); 

輸出:

Array 
(
    [fruit] => Array 
     (
      [apple] => Array 
       (
        [0] => 1 
        [1] => 2 
       ) 

      [orange] => Array 
       (
        [0] => 2 
        [1] => 2 
       ) 

      [banana] => Array 
       (
        [0] => 3 
        [1] => 2 
       ) 

     ) 

    [drink] => Array 
     (
      [milk] => Array 
       (
        [0] => 5 
        [1] => 2 
       ) 

      [soda] => 2 
     ) 
) 

所以,如果你想知道有多少橘子在$basketC,你只需要做:

array_sum($basketC['fruit']['orange']); // 4 

這樣你就不需要使用任何黑客,緩慢和未經證實的自定義功能。

+0

雖然我很驚訝,但看起來這個代碼我會認爲它合併了兩次,使得值加倍,但我測試了它,它的工作原理應該如此。謝謝!! – 2010-01-22 19:17:58

+1

@John Isaacks:沒問題,看我的更新... – 2010-01-22 19:20:27