“Assignment by reference is also supported, using the "$var = &$othervar;" syntax. Assignment by reference means that both variables end up pointing at the same data, and nothing is copied anywhere.”
“PHP 支持引用赋值,使用“$var = &$othervar;”语法。引用赋值意味着两个变量指向了同一个数据,没有拷贝任何东西。”
--PHP manual
$map = array(1,2,3);
foreach ($map as &$k){}
foreach ($map as $k){}
print_r($map);
输出的结果是Array ( [0] => 1 [1] => 2 [2] => 2 ),而不是Array ( [0] => 1 [1] => 2 [2] => 3 )。
分析程序:在第一次的foreach循环中,利用var_dump打印每一次的$map值,结果为:
array(size=3)0=>&int1 1=>int2 2=>int3
array(size=3)0=>int1 1=>&int2 2=>int3
array(size=3)0=>int1 1=>int2 2=>&int3
可以看出$key分别指向$map数组的每个元素,foreach结束以后$k指向$map第三个元素$map[2]。
在第二次的foreach循环中,利用var_dump打印每一次的$map值,结果为:
array(size=3)0=>int1 1=>int2 2=>&int1
array(size=3)0=>int1 1=>int2 2=>&int2
array(size=3)0=>int1 1=>int2 2=>&int2
相当于每次分别将$map的每个值赋给$k指向的地址上,也就是$map[2]分别为1,2,2,得出最后$map的结果是Array ( [0] => 1 [1] => 2 [2] => 2 )。
如果在第一个foreach结束以后加一个unset($key),将$key指向的地址清空以后,结果为Array ( [0] => 1 [1] => 2 [2] => 3 )。