6

Есть ли функция для копирования массива в PHP?

30

Проблема: Копирование массива в PHP

Существует ли функция для создания копии массива в PHP?

Я несколько раз сталкивался с проблемами при копировании массивов в PHP. Мне нужно скопировать массив, определенный внутри объекта, в глобальную область вне этого объекта. Как правильно это сделать?

5 ответ(ов)

2

В PHP по умолчанию массивы копируются. Ссылки в PHP необходимо указывать явно.

В приведённом примере:

$a = array(1,2);
$b = $a; // $b будет отдельным массивом
$c = &$a; // $c будет ссылкой на $a

При выполнении $b = $a; происходит создание копии массива $a, и $b будет отдельным массивом, не связанным с оригиналом. Тем временем, при присваивании $c = &$a; переменная $c становится ссылкой на массив $a, и любые изменения, внесённые в $a, будут отражаться на $c и наоборот.

0

Когда вы выполняете

$array_x = $array_y;

PHP действительно копирует массив, так что не совсем понятно, как вы могли столкнуться с проблемой. В вашем случае,

global $foo;
$foo = $obj->bar;

должно работать корректно.

Чтобы столкнуться с проблемами, я полагаю, вам нужно было использовать ссылки или ожидать, что объекты внутри массивов будут клонированы.

0

Использование следующего кода:

$new = unserialize(serialize($old));

создает "глубокую" копию переменной $old, что означает, что все вложенные массивы и объекты также копируются. Это означает, что новая переменная $new не будет ссылаться на оригинальные данные, и изменения в одной из переменных не повлияют на другую.

Таким образом, данный метод эффективно разрывает все ссылки и гарантирует, что вы получите полностью независимую копию данных. Однако имейте в виду, что данный способ может быть неэффективным для больших структур данных и имеет ограничения при работе с объектами, содержащими ресурсы (например, файловые дескрипторы).

0

Если в вашем массиве только базовые типы, вы можете сделать так:

$copy = json_decode(json_encode($array), true);

Это избавит вас от необходимости вручную обновлять ссылки.

Понимаю, что это решение не универсально и не сработает для всех случаев, но для меня это сработало.

0

Я знаю, что это известно давно, но это сработало для меня:

$copied_array = array_slice($original_array, 0, count($original_array));

Этот код создает копию оригинального массива $original_array, используя функцию array_slice, которая извлекает элементы массива с нулевого индекса до длины оригинального массива. Таким образом, вы получаете полную копию массива.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь