Есть ли функция для копирования массива в PHP?
Проблема: Копирование массива в PHP
Существует ли функция для создания копии массива в PHP?
Я несколько раз сталкивался с проблемами при копировании массивов в PHP. Мне нужно скопировать массив, определенный внутри объекта, в глобальную область вне этого объекта. Как правильно это сделать?
5 ответ(ов)
В PHP по умолчанию массивы копируются. Ссылки в PHP необходимо указывать явно.
В приведённом примере:
$a = array(1,2);
$b = $a; // $b будет отдельным массивом
$c = &$a; // $c будет ссылкой на $a
При выполнении $b = $a;
происходит создание копии массива $a
, и $b
будет отдельным массивом, не связанным с оригиналом. Тем временем, при присваивании $c = &$a;
переменная $c
становится ссылкой на массив $a
, и любые изменения, внесённые в $a
, будут отражаться на $c
и наоборот.
Когда вы выполняете
$array_x = $array_y;
PHP действительно копирует массив, так что не совсем понятно, как вы могли столкнуться с проблемой. В вашем случае,
global $foo;
$foo = $obj->bar;
должно работать корректно.
Чтобы столкнуться с проблемами, я полагаю, вам нужно было использовать ссылки или ожидать, что объекты внутри массивов будут клонированы.
Использование следующего кода:
$new = unserialize(serialize($old));
создает "глубокую" копию переменной $old
, что означает, что все вложенные массивы и объекты также копируются. Это означает, что новая переменная $new
не будет ссылаться на оригинальные данные, и изменения в одной из переменных не повлияют на другую.
Таким образом, данный метод эффективно разрывает все ссылки и гарантирует, что вы получите полностью независимую копию данных. Однако имейте в виду, что данный способ может быть неэффективным для больших структур данных и имеет ограничения при работе с объектами, содержащими ресурсы (например, файловые дескрипторы).
Если в вашем массиве только базовые типы, вы можете сделать так:
$copy = json_decode(json_encode($array), true);
Это избавит вас от необходимости вручную обновлять ссылки.
Понимаю, что это решение не универсально и не сработает для всех случаев, но для меня это сработало.
Я знаю, что это известно давно, но это сработало для меня:
$copied_array = array_slice($original_array, 0, count($original_array));
Этот код создает копию оригинального массива $original_array
, используя функцию array_slice
, которая извлекает элементы массива с нулевого индекса до длины оригинального массива. Таким образом, вы получаете полную копию массива.
Сортировка двумерного массива по значению в столбце
Можно ли привязать массив к условию IN() в запросе PDO?
Как добавить элементы в пустой массив в PHP?
Самый быстрый способ дублирования массива в JavaScript: slice против цикла 'for'
Сортировка массива объектов по одному свойству