Я могу присвоить массив только, заставив это равняться другому массиву?

У меня есть массив $x с ненулевым числом элементов. Я хочу создать другой массив ($y) который равен $x. Затем я хочу сделать некоторые манипуляции с $y не вызывая изменений в $x. Я могу создать $y таким образом:

$y = $x;

Другими словами, если я изменяю $y созданный вышеупомянутым показанным способом, будет я изменять значение $x?

6
задан Roman 16 June 2010 в 14:41
поделиться

3 ответа

Давайте попробуем:

$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
)

А в документации сказано:

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

10
ответ дан 9 December 2019 в 20:40
поделиться

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

<?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
                )

        )

)
*/
1
ответ дан 9 December 2019 в 20:40
поделиться

Нет, копия не меняет оригинал.

Это изменило бы его, если бы вы использовали ссылку на исходный массив:

$a = array(1,2,3,4,5);
$b = &$a;
$b[2] = 'AAA';
print_r($a);
1
ответ дан 9 December 2019 в 20:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: