foreach引用的坑
今天在网上看到一段代码,讲了foreach引用的坑
你认为会输出什么?
实际上数据结果是这样Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 ) 1 4 9 9是不是有些意外?为什么最后会是两个9?
其实按照官网文档所说,使用foreach的时候,引用变量不会消除,所以,当第一个foreach执行完成后,$v仍然指向$data的最后一个元素
因为作用域的问题,$v实际上还是存在于符号表中,例如,代码改成这样结果如下
Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 ) 16瞧,$v指向的是16,也就是最后一个元素
最后,根据官方对foreach 的定义:格式遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步
简单来说,就是先将数组当前值赋值给$v,然后再移动指针,如果$v是引用的话,就会直接覆盖掉旧值
这样说可能不明确,请看下面代码和输出这是输出:
Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 ) Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 1 ) 1 Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 4 ) 4 Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 9 ) 9 Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 9 ) 9如何,是不是一下子就看懂了?
虽然这个问题可能不常遇到,但现在仅作为一个坑记录在这里,防止以后踩坑忘了这个。