У меня есть массив $x
с ненулевым числом элементов. Я хочу создать другой массив ($y
) который равен $x
. Затем я хочу сделать некоторые манипуляции с $y
не вызывая изменений в $x
. Я могу создать $y
таким образом:
$y = $x;
Другими словами, если я изменяю $y
созданный вышеупомянутым показанным способом, будет я изменять значение $x
?
Давайте попробуем:
$a = array(0,1,2);
$b = $a;
$b[0] = 5;
print_r($a);
print_r($b);
дает
Array
(
[0] => 0
[1] => 1
[2] => 2
)
Array
(
[0] => 5
[1] => 1
[2] => 2
)
Назначение массива всегда включает в себя копирование значения . Используйте оператор ссылки, чтобы скопировать массив по ссылке.
Массивы копируются по значению. Есть кое-что. Если элемент является ссылкой, ссылка копируется, но относится к тому же объекту.
<?php
class testClass {
public $p;
public function __construct( $p ) {
$this->p = $p;
}
}
// create an array of references
$x = array(
new testClass( 1 ),
new testClass( 2 )
);
//make a copy
$y = $x;
print_r( array( $x, $y ) );
/*
both arrays are the same as expected
Array
(
[0] => Array
(
[0] => testClass Object
(
[p] => 1
)
[1] => testClass Object
(
[p] => 2
)
)
[1] => Array
(
[0] => testClass Object
(
[p] => 1
)
[1] => testClass Object
(
[p] => 2
)
)
)
*/
// change one array
$x[0]->p = 3;
print_r( array( $x, $y ) );
/*
the arrays are still the same! Gotcha
Array
(
[0] => Array
(
[0] => testClass Object
(
[p] => 3
)
[1] => testClass Object
(
[p] => 2
)
)
[1] => Array
(
[0] => testClass Object
(
[p] => 3
)
[1] => testClass Object
(
[p] => 2
)
)
)
*/
Нет, копия не меняет оригинал.
Это изменило бы его, если бы вы использовали ссылку на исходный массив:
$a = array(1,2,3,4,5);
$b = &$a;
$b[2] = 'AAA';
print_r($a);