【问题标题】:How to merge array and preserve keys?如何合并数组并保留键?
【发布时间】:2013-07-01 23:46:53
【问题描述】:

我有两个数组:

$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);
  • array_merge() 的问题在于它看到"123" 键,并将其解释为数字,然后重新索引。

标签: php arrays


【解决方案1】:

假设我们有 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():

    $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 起可用。

    更新

    也可以使用联合array operator;它适用于旧版本,实际上也可能更快:

    print_r($array2 + $array1);
    

    【讨论】:

    • @joe 不客气。当然,还是有循环的,不同的是它发生在哪里:)
    • 我的解决方案将作为该功能的 5.3 之前的猴子补丁
    【解决方案3】:

    @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;
         }
     }
    

    【讨论】:

    • 我不想使用循环,有没有高性能的方法?
    • 我想不出一个能满足数字键要求的。不过不要把解决方案排除在外,我认为循环不会导致您想象的性能下降。
    • 您可以通过将$ret 直接设置为第一个数组,然后在此之上合并其他数组来优化这一点。
    • @jcsanyi 好电话...我更改了答案以包括您的优化,并更改了措辞以将杰克的解决方案作为本地方式引用,并将我的解决方案作为 5.3 之前安装的后备方式
    【解决方案4】:

    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));
    

    Demo

    【讨论】:

      【解决方案5】:

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

      foreach ($i = 0, $num = count($array2); $i < $num; $i++)
      {
        $array = array_merge($array1, $arrar2[$i]);
      }
      

      【讨论】:

        猜你喜欢
        • 2014-05-08
        • 1970-01-01
        • 1970-01-01
        • 2021-05-29
        • 2016-12-14
        • 2013-05-23
        • 2015-12-27
        • 2018-01-08
        • 1970-01-01
        相关资源
        最近更新 更多