今天遇到了PHP语言的一个坑,开始以为是PHP的bug,相关代码简化如下:
1 <?php 2 3 $ary = array(‘first‘, ‘second‘, ‘third‘); 4 5 foreach ($ary as $k => &$v) { 6 } 7 8 foreach ($ary as $k => $v) { 9 } 10 11 var_dump($ary);
dump出来的结果让人百思不得其解:
1 array(3) { 2 [0]=> 3 string(5) "first" 4 [1]=> 5 string(6) "second" 6 [2]=> 7 &string(6) "second" 8 }
为什么最后一个元素的值与倒数第二个相等了,还多了一个引用符号。果然在手册里查到了这么一个相关的警告
说foreach循环结束后$v保存了最后一个元素的引用,但还是不清楚上面这种情况到底是怎么发生的,然后搜索相关资料,终于在这篇文章把这个问题说明白了References and foreach
大概是这个意思:第一个foreach循环之后,$v保存了$ary最后一个元素的引用,所以在第二次foreach循环中,每一次循环对$v的赋值,其实是对$ary最后一个元素进行赋值,遍历整个数组,最后一个元素的值自然与倒数第二个元素相等。在var_dump结果中最有一个元素前有个‘&‘符号,表示该元素已被其他值引用,这里就是$v。
原文:http://www.cnblogs.com/helloxk/p/3621909.html