Как клонировать массив объектов в PHP? - PullRequest
54 голосов
/ 21 июня 2011

У меня есть массив объектов.Я знаю, что объекты присваиваются «ссылкой», а массивы - «значением».Но когда я присваиваю массив, каждый элемент массива ссылается на объект, поэтому, когда я изменяю объект в одном массиве, изменения отражаются в другом.или я должен пройти через него, чтобы клонировать каждый объект?

Ответы [ 12 ]

0 голосов
/ 26 октября 2015

Объекты передаются по умолчанию по умолчанию и их не всегда легко клонировать, тем более что они могут иметь циклические ссылки.Вы бы лучше подходили с другим выбором структур данных.

Для тех, кто предоставляет решения для поверхностного копирования, более простой способ:

 $b = (array)$a;

Для глубоких копий я не рекомендую это решение:

$ nuarr = json_decode (json_encode ($ array));

Это для глубокой копии.Он поддерживает только подмножество типов PHP и будет заменять объекты массивом или массивами на объекты, которые могут быть не тем, что вы хотите, а также потенциально искажать двоичные значения и т. Д.

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

Может быть лучше использовать unserialize (serialize ($ a)) дляглубокие копии, если производительность не является проблемой, которая имеет более широкую поддержку для таких вещей, как объекты, хотя я бы не удивился, если бы она разбивалась для циклических ссылок и некоторых других необычных вещей.

array_merge_recursive или array_walk_recursive могут также использоваться для массивов.

Вы можете легко создать свою собственную рекурсивную функцию, которая использует is_object и is_array для выбора подходящих средств копирования.

0 голосов
/ 19 декабря 2014

или также

$nuarr = json_decode(json_encode($array));

но это дорого, я предпочитаю версию Sebastien (array_map)

...