foreach() 中用指針指向數組元素,循環結束后最好銷毀指針


之前發過一次微博,今天又遇到這個問題,並且再次犯錯,於是決定再加深一下。

就舉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:之前的微博如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM