Оператор array_replace() vs. union в PHP

В PHP (при условии, что $a, $b и $c являются массивами) $a = array_replace($b, $c) всегда функционально идентичен $a = $c + $b?

Кажется, я не могу найти какие-либо краевые случаи, которые указывали бы иначе.

(просто работая с одним измерением, этот вопрос не связан с рекурсией, то есть: array_replace_recursive())


Изменить. Я нашел примечание в комментарии, которое предполагает, что оператор объединения сохранит ссылки, но я не заметил, что array_replace() не смог этого сделать.

Ответы

Ответ 1

EDIT: Ах, извините, я не заметил, что аргументы были отменены. Ответ да, то, потому что результирующий массив всегда объединяет два массива, но в то время как + дает приоритет значениям в первом массиве и array_replace ко второму.

Единственное фактическое различие заключается в производительности, где + может быть предпочтительным, поскольку, когда он находит дубликаты, он не заменяет значение; он просто движется дальше. Кроме того, это не предполагает (относительно дорогого) вызова функции.


Нет. array_replace заменяет элементы, а + учитывает первое значение:

<?php
print_r(array_replace([0 => 1], [0 => 2]));
print_r([0 => 1] + [0 => 2]);
Array
(
    [0] => 2
)
Array
(
    [0] => 1
)

В процитировать руководство:

Оператор + возвращает правый массив, присоединенный к левому массиву; для ключей, которые существуют в обоих массивах, будут использоваться элементы из левого массива, а соответствующие элементы из правого массива будут игнорироваться.

Что касается ссылок, они сохраняются в обоих случаях.

Ответ 2

Следует также упомянуть, что array_merge также работает так же, как array_replace, если поставляемые массивы имеют нечисловые ключи.