скопировать массив в другой массив 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.
Функции для работы с массивами
Содержание
User Contributed Notes 14 notes
A simple trick that can help you to guess what diff/intersect or sort function does by name.
Example: array_diff_assoc, array_intersect_assoc.
Example: array_diff_key, array_intersect_key.
Example: array_diff, array_intersect.
Example: array_udiff_uassoc, array_uintersect_assoc.
This also works with array sort functions:
Example: arsort, asort.
Example: uksort, ksort.
Example: rsort, krsort.
Example: usort, uasort.
?>
Return:
Array ( [ 0 ] => Cero [ 1 ] => Uno [ 2 ] => Dos [ 3 ] => Cuatro [ 4 ] => Cinco [ 5 ] => Tres [ 6 ] => Seis [ 7 ] => Siete [ 8 ] => Ocho [ 9 ] => Nueve [ 10 ] => Diez )
Array ( [ 0 ] => Cero [ 1 ] => Uno [ 2 ] => Dos [ 3 ] => Tres [ 4 ] => Cuatro [ 5 ] => Cinco [ 6 ] => Seis [ 7 ] => Siete [ 8 ] => Ocho [ 9 ] => Nueve [ 10 ] => Diez )
?>
Updated code of ‘indioeuropeo’ with option to input string-based keys.
Here is a function to find out the maximum depth of a multidimensional array.
// return depth of given array
// if Array is a string ArrayDepth() will return 0
// usage: int ArrayDepth(array Array)
Short function for making a recursive array copy while cloning objects on the way.
If you need to flattern two-dismensional array with single values assoc subarrays, you could use this function:
to 2g4wx3:
i think better way for this is using JSON, if you have such module in your PHP. See json.org.
to convert JS array to JSON string: arr.toJSONString();
to convert JSON string to PHP array: json_decode($jsonString);
You can also stringify objects, numbers, etc.
Function to pretty print arrays and objects. Detects object recursion and allows setting a maximum depth. Based on arraytostring and u_print_r from the print_r function notes. Should be called like so:
I was looking for an array aggregation function here and ended up writing this one.
Note: This implementation assumes that none of the fields you’re aggregating on contain The ‘@’ symbol.
While PHP has well over three-score array functions, array_rotate is strangely missing as of PHP 5.3. Searching online offered several solutions, but the ones I found have defects such as inefficiently looping through the array or ignoring keys.
Преобразование массива в объект в PHP. Как скопировать массив в PHP
В этой статье поговорим, как преобразовать массив в объект и как создать ссылку на массив и скопировать его. Начнём с преобразования — здесь нам поможет приведение массива к типу object. Как только мы выполним преобразование массива в тип object, произойдёт создание нового экземпляра встроенного в PHP класса stdClass.
1. Преобразование массива
Итак, представьте, что у нас есть ассоциативный массив, и мы желаем преобразовать его в объект.
Теперь посмотрим на stdClass
Обращаемся к членам объекта в PHP
После выполнения преобразования ряд элементов нашего объекта (бывшего массива) мы можем получить как член класса, если они отвечают правилам именования переменной (тут следует понимать, что правильное имя должно начинаться с буквы либо символа подчеркивания, а также состоять из цифр, букв и символов подчеркивания в любом количестве).
Переменное имя свойства
Если ключ нашего элемента содержал другие символы (допустим, дефис), получить значение мы сможем лишь при помощи переменного имени свойства.
Числовые ключи
Если же ключ был числовым, получить значение из объекта в PHP мы можем лишь при помощи итераций foreach :
2. Создание ссылки и копирование массива
Теперь перейдём ко второй части нашей статьи. На самом деле, скопировать массив в PHP несложно:
Смотрим результат:
Что касается создания ссылки на массив в PHP, то нам надо всего лишь добавить амперсант:
На этом всё, приобрести более глубокие навыки PHP-программирования вы сможете на наших курсах:
Как клонировать массив объектов в 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 есть множество функций и операторов: Сборник функций для работы с массивами
Есть несколько способов, чтобы добавить массив в массив при помощи php и все они могут пригодиться для отдельных случаев.
«Оператор +»
Это простой, но коварный способ:
А теперь более подробный пример, чтобы проиллюстрировать это:
Функция array_merge()
Использовать эту функцию можно следующим образом:
Она сбрасывает числовые индексы и заменяет строковые. Отлично подходит для того, чтобы склеить два или несколько массивов с числовыми индексами:
Если входные массивы имеют одинаковые строковые ключи, тогда каждое последующее значение будет заменять предыдущее. Однако, если массивы имеют одинаковые числовые ключи, значение, упомянутое последним, не заменит исходное значение, а будет добавлено в конец массива.
Функция array_merge_recursive
Делает то же самое, что и array_merge только еще и рекурсивно проходит по каждой ветке массива и проделывает то же самое с потомками. Подробная справка по array_merge_recursive
Функция array_replace()
Заменяет элементы массива элементами других переданных массивов. Подробная справка по array_replace.
Функция array_replace_recursive()
То же что и array_replace только обрабатывает все ветки массива. Справка по array_replace_recursive.