通过复制值或引用分配php数组?

时间:2012-01-17 16:00:59

标签: php arrays variable-assignment

  

可能重复:
  are arrays in php passed by value or by reference?

我听说PHP可以选择如何分配数组,取决于数组大小。 它可以通过复制值(作为任何标量类型)或通过引用进行分配。

PHP总是通过复制值将数组赋值给变量,如手册中所述。

或者它可以通过引用分配。 ?

<?php $a = array(1,2,3); ?>

3 个答案:

答案 0 :(得分:20)

将数组变量分配给其他变量时,可以通过引用分配数组:

// By value...
$a = array(1,2,3);
$b = $a;
array_push($a, 5);
print_r($b);

// $b is not a reference to $a
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

// By Reference
$a = array(1,2,3);
$b = &$a; // Here we assign by reference
array_push($a, 5);
print_r($b);

// $b is a reference to $a and gets the new value (3 => 5)
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 5
)

答案 1 :(得分:13)

除非您引用已存在的内容,否则无法通过引用分配内容。同样,你不能复制不存在的东西。

所以这段代码:

$a = array(1,2,3);

...既不复制也不引用 - 它只是创建一个新的数组,用值填充它,因为这些值是按字面指定的。

但是,这段代码:

$x = 1;
$y = 2;
$z = 3;
$a = array($x,$y,$z);

...将$x$y$z的值复制到数组 1 中。用于初始化数组值的变量仍然存在,并且可以在不影响数组中的值的情况下进行修改或销毁。

此代码:

$x = 1;
$y = 2;
$z = 3;
$a = array(&$x,&$y,&$z);

...创建一系列对$x$y$z的引用(注意&)。如果在运行此代码后,我修改$x - 假设我给它一个值为4 - 它也会修改数组中的第一个值。因此,当您使用数组时,$a[0]现在将包含4

有关PHP参考工作方式的更多信息,请参阅手册的this section


1 根据用作数组成员的变量的类型和值,即使按赋值分配,也可能在赋值时不会发生复制操作。在内部PHP由于性能和内存效率的原因,在尽可能多的情况下使用copy-on-write。但是,就代码上下文中的行为而言,您可以将其视为简单副本。

答案 2 :(得分:1)

是的,请使用&

$a = array(&$b, &$c, &$d);