如何合并数组和保留键?


69

我有两个数组:

$array1 = array('a' => 1, 'b' => 2, 'c' => 3);
$array2 = array('d' => 4, 'e' => 5, 'f' => 6, 'a' => 'new value', '123' => 456);

我想合并它们并保留键和顺序,而不是重新索引!!

怎么会这样?

Array
(
    [a] => new value
    [b] => 2
    [c] => 3
    [d] => 4
    [e] => 5
    [f] => 6
    [123] => 456
)

我尝试使用array_merge(),但不会保留键:

print_r(array_merge($array1, $array2));

Array
(
    [a] => 'new value'
    [b] => 2
    [c] => 3
    [d] => 4
    [e] => 5
    [f] => 6
    [0] => 456
)

我尝试使用联合运算符,但它不会覆盖该元素:

print_r($array1 + $array2);

Array
(
    [a] => 1   <-- not overwriting
    [b] => 2
    [c] => 3
    [d] => 4
    [e] => 5
    [f] => 6
    [123] => 456
)

我尝试交换位置,但顺序错误,不是我的需要:

print_r($array2 + $array1);

Array
(
    [d] => 4
    [e] => 5
    [f] => 6
    [a] => new value 
    [123] => 456
    [b] => 2
    [c] => 3
)

我不想使用循环,有没有一种高性能的方法?


您不只是翻转数组合并的顺序吗?array_merge($ array2,$ array1);
赛斯·麦克莱恩

2
array_merge()的问题在于它看到"123"键,并将其解释为数字,然后重新编制索引。
jcsanyi

Answers:


163

您正在寻找array_replace()

$array1 = array('a' => 1, 'b' => 2, 'c' => 3);
$array2 = array('d' => 4, 'e' => 5, 'f' => 6, 'a' => 'new value', '123' => 456);
print_r(array_replace($array1, $array2));

自PHP 5.3起可用。

更新资料

您也可以使用联合数组运算符; 它适用于旧版本,并且实际上可能也更快:

print_r($array2 + $array1);

1
@joe不客气。当然,还是有一个循环,不同的是它发生的:)
杰克

我的解决方案将充当该功能的5.3版之前的猴子补丁
Orangepill 2013年

4

@Jack发现了可以执行此操作的本机功能,但是由于它仅在php 5.3及更高版本中可用,因此应该可以在5.3之前的安装中模拟此功能

  if(!function_exists("array_replace")){
      function array_replace(){
         $args = func_get_args();
         $ret = array_shift($args);
         foreach($args as $arg){
             foreach($arg as $k=>$v){
                $ret[(string)$k] = $v;
             }
         }
         return $ret;
     }
 }

我不想使用循环,有没有一种高性能的方法?
贾斯珀

我想不出能满足数字键要求的产品。不过,请不要指望解决方案,我认为循环不会导致您想象中的性能下降。
Orangepill 2013年

您可以通过$ret直接设置第一个数组,然后在其上合并其他数组来稍微优化一下。
jcsanyi

@jcsanyi不错的电话...我更改了答案,以包括您的优化,并将措辞更改为引用杰克解决方案的本机方式,将我的内容更改为5.3版之前安装的后备方式
Orangepill 2013年

3

假设我们有3个数组,如下所示。

$a = array(0=>['label'=>'Monday','is_open'=>1],1=>['label'=>'Tuesday','is_open'=>0]);

$b = array(0=>['open_time'=>'10:00'],1=>['open_time'=>'12:00']); 

$c = array(0=>['close_time'=>'18:00'],1=>['close_time'=>'22:00']); 

现在,如果要合并所有这些数组,并想要一个最终数组,其所有数组的数据都位于键0 in 0和键1 in 1等下,依此类推。

然后,您需要使用array_replace_recursive PHP函数,如下所示。

$final_arr = array_replace_recursive($a, $b , $c); 

结果如下。

Array
(
    [0] => Array
        (
            [label] => Monday
            [is_open] => 1
            [open_time] => 10:00
            [close_time] => 18:00
        )

    [1] => Array
        (
            [label] => Tuesday
            [is_open] => 0
            [open_time] => 12:00
            [close_time] => 22:00
        )

)

希望以上解决方案最适合您的要求!!


2

array_replace_recursive()还是array_replace()您正在寻找的功能

$array1 = array('a' => 1, 'b' => 2, 'c' => 3);
$array2 = array('d' => 4, 'e' => 5, 'f' => 6, 'a' => 'new value', '123' => 456);


var_dump(array_replace_recursive($array1, $array2));

演示版


-2

我认为如果我理解正确,这可能会有所帮助:

foreach ($i = 0, $num = count($array2); $i < $num; $i++)
{
  $array = array_merge($array1, $arrar2[$i]);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.