老实说,我不知道如何制定这个传递参考的难题

时间:2012-03-27 10:38:19

标签: php arrays pass-by-reference

所以这就是我看到这段代码的作用:

  • 制作阵列
  • 循环迭代10次
    • 创建新阵列
    • 对此新数组的引用保存在第一个数组
  • 10个数组现在位于原始数组中,值为0,1,2,3 ......

真正发生的事情:

  • WTF?

代码:

<?php

header('Content-type: text/plain');

$arrays = array();

foreach(range(0, 10) as $i)
{
    $arr = array();
    $arr[0] = $i;

    $arrays[] = &$arr;
}

print_r($arrays);

输出:

Array
(
    [0] => Array
        (
            [0] => 10
        )

    [1] => Array
        (
            [0] => 10
        )

    [2] => Array
        (
            [0] => 10
        )

    [3] => Array
        (
            [0] => 10
        )

    [4] => Array
        (
            [0] => 10
        )

    [5] => Array
        (
            [0] => 10
        )

    [6] => Array
        (
            [0] => 10
        )

    [7] => Array
        (
            [0] => 10
        )

    [8] => Array
        (
            [0] => 10
        )

    [9] => Array
        (
            [0] => 10
        )

    [10] => Array
        (
            [0] => 10
        )

)

我想确切地知道为什么显然只有第10个数组被引用了10次,而不是每个引用的数组的每个实例都被引用一个。

如果有人不仅仅想要WTF(像我一样)想要编辑标题,请随意这样做。

4 个答案:

答案 0 :(得分:3)

该行

$arr = array();

不会创建新数组,而是为现有引用指定一个空数组。 如果您希望变量名称“指向”内存中的不同数组,则在为其分配空数组之前,必须先unset()(或“断开”)它:

foreach(range(0, 10) as $i)
{
    unset($arr);
    $arr = array();
    $arr[0] = $i;

    $arrays[] = &$arr;
}

这是因为可以使变量指向其他内容的唯一操作是引用分配(=&)和unset()

答案 1 :(得分:1)

这里发生的事情是,通过在$arr内向$arrays插入引用,您实际上会添加10次完全相同的数组 - 并且每次引用数组具有最后分配给它的值(即$i为10时产生的值)。

通过在每次迭代中插入引用来实现目标尚不清楚 - 删除&或将unset($arr)放在循环的开头会给出你预期的行为。你想要完成什么?

答案 2 :(得分:0)

以这种方式思考。你做了$arrays[] = &$arr; 10次。这将存储对局部变量$arr的引用10次。由于它是相同的变量(变量的范围是整个函数),因此它将所有10次存储相同的引用。那么,为什么你期望这10个元素不同呢?

您存储的引用与$arr无关;它只与变量 $arr有关。当您打印参考时,它会在那时打印$arr的值。

答案 3 :(得分:-1)

这是因为您将引用存储到$arr指向数组的数组中。并且你用最新的数字覆盖那个数组。 $arr中的所有引用都将指向最后的相同数组。

我不知道你最终会想到什么,但是摆脱&应该可以解决这个问题。