php:foreach同时使用$value和&$value时的一个坑

来源:互联网 发布:淘宝助理连打设置 编辑:程序博客网 时间:2024/06/03 12:27

前言

今天吃饭的时候同事发了一个很有意思的一段代码

<?php$array = array(1, 2, 3);foreach($array as &$value){}print_r($array);   //输出 1,2,3foreach($array as $value){}print_r($array);   //输出1, 2, 2

很有意思,经过两个foreach后数组变了

原因

回来后查了下官方文档对foreach的解释,关键点如下

1.每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)2.可以很容易地通过在 $value 之前加上 & 来修改数组的元素。此方法将以引用赋值而不是拷贝一个值3.数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁ps: 对$key同样适用 本文就只分析$value了

前两点是基础知识了,关键是第三点,很容易分析得到:

1.foreach之后如果$value应该指向的是数组最后一个元素,如果$value是引用的话循环后仍然保留,即$value将一直是指向最后一个元素的引用

2.而本文例子第二次使用foreach时不是使用&$value 而是 $value,所以$value在这次循环中还是一直指向最后一个元素(也就是说如果第二次使用&$value的话就没问题),于是最后一个元素的将一直随着循环到值一直改变,最后和倒数第二个元素的值一样

总结

只要使用foreach($array as &$value)这种传引用的格式时,在foreach之后记得加上unset($value),即使是该代码段中当下只存在一个foreach,以防以后修改代码的时候自己遗忘或者给后来者挖坑

1 0