为什么在2个foreach循环后数组的最后一个元素发生了变化?

时间:2015-05-14 01:34:35

标签: php arrays

什么是神奇的? 每个循环后,$ data的最后一个元素发生了变化。

<?php
$data = array("1" => "a", "2" => "b");
print_r($data);
foreach($data as $k=>&$v) {}
foreach($data as $k=>$v) {}
print_r($data);

输出:[2] =&gt; a在第二个foreach之后

Array
(
    [1] => a
    [2] => b
)
Array
(
    [1] => a
    [2] => a
)

代码改为此,数组不会改变:

<?php
foreach($data as $k=>&$v) {}
foreach($data as $k=>&$v) {}

1 个答案:

答案 0 :(得分:5)

来自foreach手册:

  

警告 $ value的引用和最后一个数组元素保持均匀   在foreach循环之后。建议通过unset()来销毁它。

因此,在第一个foreach的末尾,$v是对数组中最后一个元素的引用。下一个foreach的第一次迭代会更改$v的值(到第一个数组元素的值),这是对数组中最后一个元素的引用,因此它会被更改。

$data = array("1" => "a", "2" => "b");
print_r($data);
foreach($data as $k=>&$v) {}
unset($v);                     // *** UNSET HERE ***
foreach($data as $k=>$v) {}
print_r($data);

结果:

Array
(
    [1] => a
    [2] => b
)
Array
(
    [1] => a
    [2] => b
)