2010-01-22 91 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