Различия между array_replace и array_merge в PHP

6

Я пытаюсь выяснить различия между array_replace() и array_merge(). Вопрос на самом деле пришел мне на ум после этого поста: PHP array_merge пустые значения всегда меньше априорных, где проблема действительно может быть решена любой из этих двух функций. Итак, я пытался выяснить, в каких случаях мы должны использовать array_replace вместо array_merge и наоборот.

После чтения документации php для обеих функций, я нахожу эти две отличия:

  1. Если массивы содержат числовые ключи, более поздняя величина не будет перезаписывать исходное значение в array_merge(), что будет сделано в array_replace().
  2. В array_merge() значения во входном массиве с числовыми ключами будут перенумерованы с добавочными ключами, начиная с нуля в массиве результатов, что не должно происходить с array_replace().

Поскольку различия связаны только с числовыми ключами, можем ли мы с уверенностью сказать, что функции array_replace() и array_merge() в точности эквивалентны, когда мы имеем дело с ассоциативными массивами? Или есть какая-то другая разница, которой я не хватает?

  • 0
    Вы должны попробовать и посмотреть, что вы получаете :)
  • 0
    @zpr попробуй что? Если вы видите упомянутый вопрос и ответы, решение работает с обеими функциями. Но я просто пытаюсь узнать, могут ли быть другие случаи, когда эти две функции не дадут одинакового результата для ассоциативных массивов.
Теги:
arrays

2 ответа

7
Лучший ответ

Для массивов со строковыми ключами, да, они эквивалентны, как вы упомянули. Если у вас есть числовые клавиши, 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
)*/
  • 0
    Следует отметить, что, если массивы имеют общий цифровой ключ, существует существенная разница. Слияние сохранит исходное содержимое, а замена будет разрушительной.
  • 0
    @tbernard Что ты имеешь в виду? Как это влияет на содержимое (не только ключи)?
Показать ещё 2 комментария
4

В своей статье Джарек дал хорошее объяснение:

https://softonsofa.com/php-array_merge-vs-array_replace-vs-plus-aka-union/

Он также добавляет в использование оператора + с массивами для сравнения.

Изображение 146967

  • 0
    Старайтесь не использовать только ссылки в качестве ответа. Рекомендуется копировать ценную информацию из связанных источников, чтобы сохранить ее на случай, если ссылка перестанет работать

Ещё вопросы

Сообщество Overcoder
Наверх
Меню