之前發過一次微博,今天又遇到這個問題,並且再次犯錯,於是決定再加深一下。
就舉php.net里的一個例子吧
$a = array('abe','ben','cam'); foreach ($a as $k=>&$n){ $n = strtoupper($n); } print_r($a); foreach ($a as $k=>$n){ // notice NO reference here!
echo "$n\n"; } print_r($a);
輸出的結果是:
Array ( [0] => ABE [1] => BEN [2] => CAM ) ABE BEN BEN Array ( [0] => ABE [1] => BEN [2] => BEN )
可以看到第一次foreach()循環以后是正常的,第二次循環以后$a[2]從變成了'BEN',和$a[1]一樣。
初看很納悶,但是如果在第二個foreach()里print_r($a),就很容易明白了,結果如下:
Array ( [0] => ABE [1] => BEN [2] => ABE ) Array ( [0] => ABE [1] => BEN [2] => BEN ) Array ( [0] => ABE [1] => BEN [2] => BEN )
由於第一個foreach()是用指針指向數組元素,所以循環結束后變量$n依然指向數組$a的最后一個元素,也就是$a[2]。
第二個foreach()里,第一次循環就將$a[0]的值'ABE'賦給$n,第二次又將$a[1]的值'BEN'賦給$n,其實這兩次修改的都是$a[2]這個元素,第三次等於沒有變化,所以$a[2]無辜地被修改了三次,導致最后的結果。
由此可見,如果foreach()中用指針指向數組元素,循環結束后最好銷毀指針,以免后面再次用到重名的變量導致數組的值被無辜修改。
PS:之前的微博如下: