Как объединить массив и сохранить ключи?
У меня есть два массива:
$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
)
Я не хочу использовать цикл, есть ли способ для высокой производительности?
Ответы
Ответ 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]);
}