【问题标题】:Changing a value in a copy of an array changes the value in the original arra更改数组副本中的值会更改原始数组中的值
【发布时间】:2014-03-18 00:19:03
【问题描述】:

我对 php 中的变量有一些我不理解的问题。

这是问题的简化代码示例。

//Create an initial array with an sub-array
$a = array();
$a['test'] = array(1,2);

//Create an reference to $a['test'] in $b
//Changing $b[0] should now change the value in $a['test'][0]
$b = &$a['test'];
$b[0] = 3;

//Create an copy of $a into $c
$c = $a;

//Change one value in $c, which is an copy of $a.
//This should NOT change the original value of $a as it is a copy.
$c['test'][1] = 5;

print_r($a);
print_r($b);
print_r($c);

这是输出:

Array
(
    [test] => Array
        (
            [0] => 3
            [1] => 5
        )

)
Array
(
    [0] => 3
    [1] => 5
)
Array
(
    [test] => Array
        (
            [0] => 3
            [1] => 5
        )

)

脚本创建一个带有子数组的数组,并在其中放入两个值。

然后将对子数组的引用放入 b 中,并以这种方式更改 a 中的值之一。

然后我将 a 复制到 c 中。

然后我改变一个 c 的值。

由于 c 是 a 的副本,我希望 c 上的更改不会影响 a。但输出却讲述了一个不同的故事。

谁能解释为什么当$c 只是$a 的副本时,更改变量$c 中的值会影响$a 中的值?为什么 $a 的值是 5?

【问题讨论】:

    标签: php arrays variables reference


    【解决方案1】:

    您通过引用将$b 分配给$a(这就是& 前缀的作用)。对$b 的任何更改都会有效地修改$a。只需强制声明分配:

    $b = $a['test'];
    

    $c 不会修改 $a。以下是发生的顺序,以及数组相同的原因:

    $a['test'] 被分配了一个 1,2 数组。
    $b 被分配为对 $a['test'] 的引用,并修改其值
    $c 然后被分配给 $a,这现在已经被$b修改了。

    【讨论】:

    • 我希望对$b 的更改影响$a 的内容。您的示例代码创建和复制 $a['test']
    • 这不是你问的,是吗?你问Can anyone explain to me what is going on?,这就是这个答案的作用……
    • 很抱歉问题不清楚。我已经编辑过了。希望它会更好地解释它。我想知道为什么 $c['test'][1] = 3;更改 $a 中的值。
    • 没有。您的答案仅在将 $c 分配给 $a 之前进行解释。我的问题是在那之后的行: $c['test'][1] = 5 。为什么这会改变 $a?
    【解决方案2】:

    我想我找到了自己问题的答案...在此页面上:http://www.php.net/manual/en/language.references.whatdo.php

    我真的不明白为什么它会这样做。我确实知道我将来可能应该避免混合引用和数组。

    我指的是这个部分:

    但是请注意,数组内部的引用可能是 危险的。使用 右侧的参考不会将左侧变成 引用,但数组内的引用保留在这些正常的 作业。这也适用于数组所在的函数调用 按值传递。示例:

    <?php
    /* Assignment of scalar variables */
    $a = 1;
    $b =& $a;
    $c = $b;
    $c = 7; //$c is not a reference; no change to $a or $b
    
    /* Assignment of array variables */
    $arr = array(1);
    $a =& $arr[0]; //$a and $arr[0] are in the same reference set
    $arr2 = $arr; //not an assignment-by-reference!
    $arr2[0]++;
    /* $a == 2, $arr == array(2) */
    /* The contents of $arr are changed even though it's not a reference! */
    ?>
    

    换句话说,数组的引用行为是定义在一个 逐个元素的基础;个人的参考行为 元素与数组的引用状态分离 容器。

    【讨论】:

      【解决方案3】:

      您正在使用 $b = &amp;$a['test']; 将引用 $a 传递给 $b 因此

      改变

      $b = &$a['test'];
      

      $b = $a['test'];
      

      【讨论】:

      • &amp; 不“复制”,它通过引用传递。它们是截然不同的东西。
      • 正如 BenM 所说,它完全不同。我不希望它作为参考,因为我希望对 $b 的更改影响 $a 的内容。
      猜你喜欢
      • 2020-10-04
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      相关资源
      最近更新 更多