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

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

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

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

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

Обновить

Вы также можете использовать оператор union array ; он работает для более старых версий и может быть и быстрее:

 print_r($array2 + $array1); 

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

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

демонстрация

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

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