Я пытаюсь выяснить различия между array_replace() и array_merge(). Вопрос на самом деле пришел мне на ум после этого поста: PHP array_merge пустые значения всегда меньше априорных, где проблема действительно может быть решена любой из этих двух функций. Итак, я пытался выяснить, в каких случаях мы должны использовать array_replace вместо array_merge и наоборот.
После чтения документации php для обеих функций, я нахожу эти две отличия:
array_merge()
, что будет сделано в array_replace()
.array_merge()
значения во входном массиве с числовыми ключами будут перенумерованы с добавочными ключами, начиная с нуля в массиве результатов, что не должно происходить с array_replace()
. Поскольку различия связаны только с числовыми ключами, можем ли мы с уверенностью сказать, что функции array_replace()
и array_merge()
в точности эквивалентны, когда мы имеем дело с ассоциативными массивами? Или есть какая-то другая разница, которой я не хватает?
Для массивов со строковыми ключами, да, они эквивалентны, как вы упомянули. Если у вас есть числовые клавиши, array_merge()
добавит их по мере необходимости и даже array_replace()
их, если необходимо, тогда как array_replace()
перезапишет исходные значения.
Например,
$a = array('a' => 'hello', 'b' => 'world');
$b = array('a' => 'person', 'b' => 'thing', 'c'=>'other', '15'=>'x');
print_r(array_merge($a, $b));
/*Array
(
[a] => person
[b] => thing
[c] => other
[0] => x
)*/
print_r(array_replace($a, $b));
/*Array
(
[a] => person
[b] => thing
[c] => other
[15] => x
)*/
Как вы можете видеть, array_merge
повторно проиндексировал числовые ключи массива, и оба они просто обновляют строковые ключи.
Однако, когда у вас есть числовые ключи, array_merge()
просто не заботится о ключах и добавляет все в том порядке, который он видит, ничего не удаляя, а array_replace()
, как следует из названия, заменяет ключи схожими (числовыми) индексами:
<?php
$a = array('0'=>'a', '1'=>'c');
$b = array('0'=>'b');
print_r(array_merge($a, $b));
/*Array
(
[0] => a
[1] => c
[2] => b
)*/
print_r(array_replace($a, $b));
/*Array
(
[0] => b
[1] => c
)*/
В своей статье Джарек дал хорошее объяснение:
https://softonsofa.com/php-array_merge-vs-array_replace-vs-plus-aka-union/
Он также добавляет в использование оператора + с массивами для сравнения.