php foreach引用,分享PHP中使用foreach和引用导致程序BUG及解决办法

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

ab299f1015edfdce437ef278854e1b1e.png

在执行第一个使用引用的 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

执行的结果, 就是数组的最后一个元素变成了倒数第二个元素的值。

bf6e8458432cd218374d643c4552608f.png

解决办法:

两个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,换成别的变量

050e154731583cbf9fbe1ac1ff7ea6b2.png

$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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值