Подтвердить что ты не робот

Как объединить массив и сохранить ключи?

У меня есть два массива:

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

Я пытаюсь использовать оператор union, но не перезаписывает этот элемент:

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
)

Я не хочу использовать цикл, есть ли способ для высокой производительности?

4b9b3361

Ответ 1

Вы ищете 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);

Ответ 2

@Jack обнаружил встроенную функцию, которая будет делать это, но поскольку она доступна только в php 5.3 и выше, это должно работать для эмуляции этой функции при установке pre 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;
     }
 }

Ответ 3

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

Демо

Ответ 4

Я думаю, что это может помочь, если я правильно понимаю:

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