Скопировать массив в другой массив php

Есть ли функция, чтобы сделать копию массива PHP в другой?

Есть ли функция, чтобы сделать копию массива PHP в другой?

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

Изменить: @AndrewLarsson поднимает вопрос в комментариях ниже. PHP имеет специальную функцию, называемую «ссылки». Они несколько похожи на указатели в таких языках, как C / C ++, но не совсем так. Если ваш массив содержит ссылки, то, хотя сам массив передается копией, ссылки все равно будут преобразовываться в исходную цель. Это, конечно, обычно желаемое поведение, но я подумал, что стоит упомянуть.

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

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

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

Обратите внимание, что вам все равно нужно реализовать __clone () для ваших объектов, если вы хотите, чтобы их свойства также были клонированы.

Эта функция работает для любого типа массива (включая смешанный тип).

Источник

array_merge

(PHP 4, PHP 5, PHP 7, PHP 8)

array_merge — Сливает один или большее количество массивов

Описание

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

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

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

Список параметров

Возвращаемые значения

Возвращает результирующий массив. Если вызывается без аргументов, возвращает пустой массив ( array ).

Список изменений

ВерсияОписание
7.4.0Функция теперь может быть вызвана без каких-либо параметров. Ранее требовался хотя бы один параметр.

Примеры

Пример #1 Пример использования array_merge()

Результат выполнения данного примера:

Пример #2 Простой пример использования array_merge()

Помните, что числовые ключи будут перенумерованы!

Если вы хотите дополнить первый массив элементами второго без перезаписи элементов первого массива и без переиндексации, используйте оператор объединения массивов + :

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

Пример #3 Пример использования array_merge() с не массивами

Результат выполнения данного примера:

Смотрите также

User Contributed Notes 2 notes

In some situations, the union operator ( + ) might be more useful to you than array_merge. The array_merge function does not preserve numeric key values. If you need to preserve the numeric keys, then using + will do that.

[ 0 ] = «zero» ;
$array1 [ 1 ] = «one» ;

$array2 [ 1 ] = «one» ;
$array2 [ 2 ] = «two» ;
$array2 [ 3 ] = «three» ;

//This will result in::

?>

Note the implicit «array_unique» that gets applied as well. In some situations where your numeric keys matter, this behaviour could be useful, and better than array_merge.

Источник

Как клонировать массив объектов в PHP?

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

12 ответов

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

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

Я также выбрал клон. Клонирование массива не работает (вы можете рассмотреть некоторую реализацию arrayaccess, чтобы сделать это для вас), так как для клонировать массив С использование array_map:

клонировать массив сериализовать и восстановить

Если ваши объекты поддерживают сериализацию, вы даже можете сортировать глубокая мелкая копия / клон с экскурсией в их спящее состояние и обратно:

однако это может быть немного авантюрно.

вам нужно зациклить его (возможно, используя такую функцию, как array_map() для этого), нет функции PHP для автоматического выполнения глубокой копии массива.

функция arg копирует массив без клонирования объектов, затем каждый вложенный объект клонируется. Поэтому он не будет работать, если алгоритм не используется внутри функции.

обратите внимание, что эта функция клонирует массив рекурсивно. Вы можете использовать array_walk вместо array_walk_recursive Если вы не хотите, чтобы это произошло.

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

чтобы клонировать массив, используйте его как коллекцию, а затем клонируйте его:

еще один шаг, вы должны добавить метод клонирования в свой класс и каждый подкласс тоже. Это важно для глубокого клонирование, или у вас могут быть непреднамеренные побочные эффекты:

важным примечанием при использовании ArrayObject является то, что вы не можете использовать is_array() больше. Поэтому помните об этом при рефакторинге кода.

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

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

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

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

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

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

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

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

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

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

Источник

Преобразование массива в объект в PHP. Как скопировать массив в PHP

В этой статье поговорим, как преобразовать массив в объект и как создать ссылку на массив и скопировать его. Начнём с преобразования — здесь нам поможет приведение массива к типу object. Как только мы выполним преобразование массива в тип object, произойдёт создание нового экземпляра встроенного в PHP класса stdClass.

1. Преобразование массива

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

Теперь посмотрим на stdClass

Обращаемся к членам объекта в PHP

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

Переменное имя свойства

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

Числовые ключи

Если же ключ был числовым, получить значение из объекта в PHP мы можем лишь при помощи итераций foreach :

2. Создание ссылки и копирование массива

Теперь перейдём ко второй части нашей статьи. На самом деле, скопировать массив в PHP несложно:

Смотрим результат: Скопировать массив в другой массив php. Смотреть фото Скопировать массив в другой массив php. Смотреть картинку Скопировать массив в другой массив php. Картинка про Скопировать массив в другой массив php. Фото Скопировать массив в другой массив php

Что касается создания ссылки на массив в PHP, то нам надо всего лишь добавить амперсант:

Скопировать массив в другой массив php. Смотреть фото Скопировать массив в другой массив php. Смотреть картинку Скопировать массив в другой массив php. Картинка про Скопировать массив в другой массив php. Фото Скопировать массив в другой массив php

На этом всё, приобрести более глубокие навыки PHP-программирования вы сможете на наших курсах:

Источник

Есть ли функция, чтобы сделать копию массива PHP другой?

Есть ли функция, чтобы сделать копию массива PHP другой?

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

В PHP массивы назначаются копией, а объекты назначаются по ссылке. Это значит, что:

Изменить: @AndrewLarsson поднимает точку в комментариях ниже. PHP имеет специальную функцию, называемую «ссылки». Они несколько похожи на указатели на языках типа C / C ++, но не совсем одинаковы. Если ваш массив содержит ссылки, тогда, когда сам массив передается копией, ссылки будут по-прежнему разрешаться исходной цели. Это, конечно, обычно желаемое поведение, но я думал, что это стоит упомянуть.

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

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

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

Обратите внимание, что вам все равно нужно реализовать __clone () для своих объектов, если вы хотите, чтобы их свойства также были клонированы.

Эта функция работает так же хорошо для любого типа массива (включая смешанный тип).

Когда вы это сделаете

PHP копирует массив, поэтому я не уверен, как вы сожгли бы вас. Для вашего случая,

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

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

array_merge() – это функция, в которой вы можете скопировать один массив в другой в PHP.

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

Вам не нужно обновлять ссылки вручную
Я знаю, что это не сработает для всех, но это сработало для меня

простой и делает глубокую копию всех ссылок

Поскольку это не было затронуто ни в одном из ответов и теперь доступно в PHP 5.3 (предполагается, что Original Post использует 5.2).

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

Вот пример использования array_replace и array_replace_recursive демонстрирующий, что он способен поддерживать индексированный порядок и способен удалить ссылку.

Работает как с индексированными, так и с индексированными массивами имен

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

Так я копирую свои массивы в Php:

Самый безопасный и дешевый способ, который я нашел, это:

Это также имеет преимущество для переопределения массива.

Это не будет работать так, как ожидалось, в ассоциативном массиве (хеш), но не каждый из предыдущих ответов.

В php-массиве вам нужно просто назначить их другой переменной, чтобы получить копию этого массива. Но сначала вам нужно убедиться в его типе, будь то массив или arrayObject или stdObject.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *