2012-07-19 132 views
4

我确定过去有很多类似的问题,所以很抱歉如果它出现之前。基本上,我试图合并两个多维数组,同时不为任何重复键创建2个键。PHP阵列合并问题

下面是一个例子:

$one = array(
    'foo' => array(
     'bar' => array(
      'hello' => 'world', 
      'boom' => 'universe' 
     ), 
     'whiz' => array(
      'wham' => array(
       'blam' => 'kaplow' 
      ) 
     ) 
    ) 
); 

$two = array(
    'foo' => array(
     'whiz' => 'woo', 
     'king' => array(
      'kong' => 'animal' 
     ) 
    ) 
); 

如果我是使用array_merge_recursive($one, $two);我会得到下面的结果:

array(1) { 
    ["foo"]=> 
    array(3) { 
    ["bar"]=> 
    array(2) { 
     ["hello"]=> 
     string(5) "world" 
     ["boom"]=> 
     string(8) "universe" 
    } 
    ["whiz"]=> 
    array(2) { 
     ["wham"]=> 
     array(1) { 
     ["blam"]=> 
     string(6) "kaplow" 
     } 
     // This is the problem. 
     [0]=> 
     string(3) "woo" 
    } 
    ["king"]=> 
    array(1) { 
     ["kong"]=> 
     string(6) "animal" 
    } 
    } 
} 

如果我使用array_merge($one, $two);我会得到如下结果:

array(1) { 
    ["foo"]=> 
    array(2) { 
    // This is good but the rest of the array is gone. 
    ["whiz"]=> 
    string(3) "woo" 
    ["king"]=> 
    array(1) { 
     ["kong"]=> 
     string(6) "animal" 
    } 
    } 
} 

下面是我之后的输出:

array(1) { 
    ["foo"]=> 
    array(3) { 
    ["bar"]=> 
    array(2) { 
     ["hello"]=> 
     string(5) "world" 
     ["boom"]=> 
     string(8) "universe" 
    } 
    // Key is replaced, rest of the array remains intact. 
    ["whiz"]=> 
    string(3) "woo" 
    ["king"]=> 
    array(1) { 
     ["kong"]=> 
     string(6) "animal" 
    } 
    } 
} 

因此,基本上,我是array_merge_recursive()功能之后,但它也一样工作array_replace_recursive(),做你们有什么想法?

-

我已经接受了一个答案了,但不要气馁有关显示任何其他可能更好的方法,我会回来看看。

谢谢你们。

+0

如果你包括你实际预期的输出,它会有所帮助。 array_replace_recursive的行为似乎是对问题最直接的解释。 – MatsLindh 2012-07-19 13:20:06

+0

@fiskfisk编辑。 – daryl 2012-07-19 13:22:05

+0

这不是递归的,但不会像'$ merged = $ one ['foo'] + $ two ['foo'];'工作? – Stano 2012-07-19 13:22:13

回答

2

认为您寻找:

function farray_merge_recursive() { 

    if (func_num_args() < 2) { 
     trigger_error(__FUNCTION__ .' needs two or more array arguments', E_USER_WARNING); 
     return; 
    } 
    $arrays = func_get_args(); 
    $merged = array(); 

    while ($arrays) { 
     $array = array_shift($arrays); 
     if (!is_array($array)) { 
      trigger_error(__FUNCTION__ .' encountered a non array argument', E_USER_WARNING); 
      return; 
     } 
     if (!$array) 
      continue; 
     foreach ($array as $key => $value) 
      if (is_string($key)) 
       if (is_array($value) && array_key_exists($key, $merged) && is_array($merged[$key])) 
        $merged[$key] = call_user_func(__FUNCTION__, $merged[$key], $value); 
       else 
        $merged[$key] = $value; 
      else 
       $merged[] = $value; 
    } 
    return $merged; 
} 

哪,我想我从PHP手册偷因为我本来不想写它自己。

我用它来组合和覆盖我的MVC框架的配置数组,它工作的很好。

+0

这工作,我只是好奇,知道是否有更好的解决方案。 – daryl 2012-07-19 13:45:27

+0

@Daryl当我仔细研究这件事时,发现的是最快的。我做了一个,但它走了走路,所以我只是贴了这个。这个函数可以通过优化来实现,但据我所知,PHP本身并没有一种快速古怪的方式。 – Sammaye 2012-07-19 13:54:59

+0

非常感谢,谢谢! – daryl 2012-07-19 13:57:30