Php создать копию массива

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

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

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

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

$a = array(); $b = $a; $b['foo'] = 42; var_dump($a); 
$a = new StdClass(); $b = $a; $b->foo = 42; var_dump($a); 

Вы можете запутаться в тонкостях, таких как ArrayObject , который является объектом, который действует точно так же, как массив. Однако, будучи объектом, он имеет ссылочную семантику.

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

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

$a = array(1,2); $b = $a; // $b will be a different array $c = &$a; // $c will be a reference to $a 

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

Читайте также:  Css modules in html

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

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

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

function array_clone($array) < return array_map(function($element) < return ((is_array($element)) ? call_user_func(__FUNCTION__, $element) : ((is_object($element)) ? clone $element : $element ) ); >, $array); > 

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

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

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

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

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

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

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

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

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

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

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

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

Код ниже написан с использованием синтаксиса короткого массива, доступного с PHP 5.4, который заменяет array() на [] . http://php.net/manual/en/language.types.array.php

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

$o1 = new stdClass; $a = 'd'; //This is the base array or the initial structure $o1->ar1 = ['a', 'b', ['ca', 'cb']]; $o1->ar1[3] = & $a; //set 3rd offset to reference $a //direct copy (not passed by reference) $o1->ar2 = $o1->ar1; //alternatively array_replace($o1->ar1, []); $o1->ar1[0] = 'z'; //set offset 0 of ar1 = z do not change ar2 $o1->ar1[3] = 'e'; //$a = e (changes value of 3rd offset to e in ar1 and ar2) //copy and remove reference to 3rd offset of ar1 and change 2nd offset to a new array $o1->ar3 = array_replace($o1->ar1, [2 => ['aa'], 3 => 'd']); //maintain original array of the 2nd offset in ar1 and change the value at offset 0 //also remove reference of the 2nd offset //note: offset 3 and 2 are transposed $o1->ar4 = array_replace_recursive($o1->ar1, [3 => 'f', 2 => ['bb']]); var_dump($o1); 
["ar1"]=> array(4) < [0]=>string(1) "z" [1]=> string(1) "b" [2]=> array(2) < [0]=>string(2) "ca" [1]=> string(2) "cb" > [3]=> &string(1) "e" > ["ar2"]=> array(4) < [0]=>string(1) "a" [1]=> string(1) "b" [2]=> array(2) < [0]=>string(2) "ca" [1]=> string(2) "cb" > [3]=> &string(1) "e" > ["ar3"]=> array(4) < [0]=>string(1) "z" [1]=> string(1) "b" [2]=> array(1) < [0]=>string(2) "aa" > [3]=> string(1) "d" > ["ar4"]=> array(4) < [0]=>string(1) "z" [1]=> string(1) "b" [2]=> array(2) < [0]=>string(2) "bb" [1]=> string(2) "cb" > [3]=> string(1) "f" > 

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

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

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

function equal_array($arr)< $ArrayObject = new ArrayObject($arr); return $ArrayObject->getArrayCopy(); > $test = array("aa","bb",3); $test2 = equal_array($test); print_r($test2); 
$copy = create_function('$a', 'return $a;'); 

Скопируйте $ _ARRAY в $ _ARRAY2:

$_ARRAY2 = array_map($copy, $_ARRAY); 

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

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

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

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

$a = array( 'data' => 10 ); $b = $a; var_dump($b); output: array:1 [ "data" => 10 ] 
private function cloneObject($mixed) < switch (true) < case is_object($mixed): return clone $mixed; case is_array($mixed): return array_map(array($this, __FUNCTION__), $mixed); default: return $mixed; >> 
 $val ) < if( is_array( $val ) ) < $result[$key] = arrayCopy( $val ); >elseif ( is_object( $val ) ) < $result[$key] = clone $val; >else < $result[$key] = $val; >> return $result; > ?> 

Источник

Копирование массива в PHP

В PHP есть несколько способов копировать массив. Ниже приведены основные из них:

Присваивание

Самый простой способ — это присвоить один массив другому:

 $array1 = [1, 2, 3]; $array2 = $array1; 

Функция array_copy

Если вы хотите глубокую копию массива (копию, которая включает вложенные массивы), вы можете использовать функцию array_copy:

 $array1 = [1, 2, ['a', 'b', 'c']]; $array2 = array_copy($array1); 

Функция array_slice

Если вы хотите скопировать только часть массива, вы можете использовать функцию array_slice:

 $array1 = [1, 2, 3, 4, 5]; $array2 = array_slice($array1, 1, 3); // array(2, 3, 4) 

Заключение

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

php как скопировать массив

  • Получить ссылку
  • Facebook
  • Twitter
  • Pinterest
  • Электронная почта
  • Другие приложения

Комментарии

Отправить комментарий

Популярные сообщения

Python вывести количество элементов списка

Python: Вывод количества элементов списка В этой статье мы рассмотрим как выводить количество элементов списка с помощью языка программирования Python. Использование функции len() Для определения количества элементов в списке в Python, используйте встроенную функцию len() . my_list = [1, 2, 3, 4, 5] elements_count = len(my_list) print(«Количество элементов в списке:», elements_count) Этот код создает список my_list , а затем использует функцию len() для подсчета элементов в списке. Результат будет выведен на экран. Использование цикла for Если вы хотите подсчитать количество элементов списка без использования функции len() , вы можете использовать цикл for . my_list = [1, 2, 3, 4, 5] elements_count = 0 for _ in my_list: elements_count += 1 print(«Количество элементов в списке:», elements_count) В этом примере мы инициализируем переменную elements_count значением 0, а затем для каждого элемента в списке увел

Python как перевести число в другую систему счисления

Преобразуйте числа как профессионал! Узнайте, как Python может перевести любое число в любую систему счисления. Даже если вы никогда раньше не сталкивались с программированием, эта статья поможет вам стать экспертом в считывании двоичных, восьмеричных и шестнадцатеричных чисел. Не пропустите возможность раскрыть секреты произвольной системы счисления в Python! Python: Перевод числа в другую систему счисления В языке программирования Python преобразование числа в другую систему счисления может быть выполнено с использованием встроенных функций и методов. Преобразование чисел в двоичную систему Python предоставляет встроенную функцию bin() для преобразования числа в двоичную систему. # Пример преобразования числа в двоичную систему num = 18 binary_num = bin(num) print(binary_num) # Вывод: 0b10010 Преобразование чисел в восьмеричную систему Функция oct() в Python преобразует число в восьмеричную систему. # Пример преобразования числа в восьмеричную систему num = 18

Как сделать шашки на python

Как сделать шашки на Python Как сделать шашки на Python В этой статье мы рассмотрим, как создать простую игру в шашки на Python с использованием библиотеки Pygame. Подготовка Для начала установите библиотеку Pygame, используя следующую команду: pip install pygame Создание доски import pygame pygame.init() WIDTH, HEIGHT = 800, 800 ROWS, COLS = 8, 8 SQUARE_SIZE = WIDTH // COLS WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) BLUE = (0, 0, 255) def draw_board(win): win.fill(WHITE) for row in range(ROWS): for col in range(row % 2, COLS, 2): pygame.draw.rect(win, BLACK, (row * SQUARE_SIZE, col * SQUARE_SIZE, SQUARE_SIZE, SQUARE_SIZE)) def main(): win = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption(«Checkers») clock = pygame.time.Clock() run = True while run: clock.tick(60) for event in pygame.event.get(): if event.ty

Источник

Оцените статью