Chinaunix首页 | 论坛 | 博客
  • 博客访问: 146973
  • 博文数量: 53
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 305
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-15 11:45
文章分类

全部博文(53)

文章存档

2019年(2)

2017年(4)

2016年(36)

2015年(11)

我的朋友

分类: PHP

2016-07-08 16:32:32

  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

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

阅读(1839) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~