所以这就是我看到这段代码的作用:
真正发生的事情:
代码:
<?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(像我一样)想要编辑标题,请随意这样做。
答案 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
中的所有引用都将指向最后的相同数组。
我不知道你最终会想到什么,但是摆脱&
应该可以解决这个问题。