在PHP中,array是最常用的结构了,可以当做队列、堆栈、hash等结构使用,所以遍历array最常用的foreach循环,我们用得很多,但其实foreach循环中有一个隐藏的坑,如下代码:
<?php
$arr = [1,2,4];
foreach($arr as &$a){
$a = $a*$a;
}
print_r($arr);
foreach($arr as $a){
print_r($a);
}
此时打印出$arr的结果是1、4、9
但第二个循环中打印出的结果是1、4、4
为什么会出现这个问题呢?
详见手册:http://php.net/manual/zh/control-structures.foreach.php
Warning
数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。
而在foreach的实现里,每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步。
当我们在第一个foreach中以引用的方式使用元素,循环结束之后,$v 其实是数组最后一个元素的引用。
由于foreach不销毁最后一个元素,所以当第一个循环结束时,我们有了一个隐藏的变量 v,它是指向数组 arr 最后一个元素的引用。
而我们在第二个循环中继续以 v命名,则会让 v指向的元素不断的被覆盖。从而使得第二个循环中,最后一次循环时得到的值和倒数第二次循环时相同。