哈哈,PHP中使用foreach和引用導致程式BUG及解決辦法

aqiandao發表於2016-07-08

  PHP中使用foreach和引用導致程式BUG及解決辦法

  foreach( $array as &$item ) { }

  print_r( $array );

  foreach( $array as $item ) { }

  print_r( $array );

  ?>1234567

  預期結果:

  Array

  (

  [0] => 1

  [1] => 2

  [2] => 3

  )

  Array

  (

  [0] => 1

  [1] => 2

  [2] => 3

  )123456789101112

  實際結果:

  Array

  (

  [0] => 1

  [1] => 2

  [2] => 3

  )

  Array

  (

  [0] => 1

  [1] => 2

  [2] => 2

  )123456789101112

  在執行第一個使用引用的 foreach 時, 一開始, $v 指向 $ar[0] 的儲存空間,空間記憶體儲著 1 , foreach 結束時, $v 指向 $ar[2] 的儲存空間,空間記憶體儲著 3 。 下面要開始執行第二個 foreach 了,注意和第一個 foreach 不同, 第二個 foreach 沒有使用引用,那麼就是賦值方式, 即將 $ar 的值依次 賦值 給 $v 。 進行到第一個元素時,要將 $ar[0] 賦值給 $v 。 問題就在這裡,由於剛剛執行完第一個 foreach, $v 不是一個新變數,而是已經存在的、指向 $ar[2] 的那個 引用 , 如此一來,對 $v 進行賦值的時候,就將 $ar[0] = 1 寫入了 $ar[2] 的實際儲存空間, 相當於對 $ar[2] 進行賦值。 依此類推,第二個 foreach 執行的結果, 就是陣列的最後一個元素變成了倒數第二個元素的值。

  解決辦法:

  兩個foreach中間加一個unset($item);

  $array = array(1,2,3);

  foreach( $array as &$item ) { }

  print_r( $array );

  unset($item);

  foreach( $array as $item ) { }

  print_r( $array );

  ?>12345678

  或者第二個foreach不要用$item,換成別的變數

  $array = array(1,2,3);

  foreach( $array as &$item ) { }

  print_r( $array );

  foreach( $array as $rs ) { }

  print_r( $array );

  ?>

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  http://blog.163.com/m13146230227_3/blog/static/260660031201667222895/

  http://blog.163.com/m13146230227_3/blog/static/26066003120166722813281/

  http://blog.163.com/m13146230227_3/blog/static/26066003120166723453652/

  http://blog.163.com/m13146230227_3/blog/static/26066003120166723859691/

  http://blog.163.com/m13146230227_3/blog/static/2606600312016672437737/

  http://blog.163.com/m13146230227_3/blog/static/26066003120166724551313/

  http://blog.163.com/m13146230227_3/blog/static/2606600312016672507881/

  http://blog.163.com/m13146230227_3/blog/static/26066003120166725345691/

  http://blog.163.com/m13146230227_3/blog/static/26066003120166725530140/

  http://blog.163.com/m13146230227_3/blog/static/26066003120166725850276/

  http://blog.sina.com.cn/s/blog_14dc17b280102weep.html

  http://blog.sina.com.cn/s/blog_14dc17b280102weeq.html

  http://blog.sina.com.cn/s/blog_14dc17b280102weer.html

  http://blog.sina.com.cn/s/blog_14dc17b280102wees.html

  http://blog.sina.com.cn/s/blog_14dc17b280102weeu.html

  http://blog.sina.com.cn/s/blog_14dc17b280102weew.html

  http://blog.sina.com.cn/s/blog_14dc17b280102weex.html

  http://blog.sina.com.cn/s/blog_14dc17b280102weey.html

  http://blog.eastmoney.com/m6711124611311778/blog_441574295.html

  http://blog.eastmoney.com/m6711124611311778/blog_441577660.html

  http://blog.eastmoney.com/m6711124611311778/blog_441580318.html

  http://blog.eastmoney.com/m6711124611311778/blog_441582275.html

  http://blog.eastmoney.com/m6711124611311778/blog_441586047.html

  http://blog.eastmoney.com/m6711124611311778/blog_441588435.html

  http://blog.eastmoney.com/m6711124611311778/blog_441592446.html

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30065054/viewspace-2121738/,如需轉載,請註明出處,否則將追究法律責任。

相關文章