博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php中foreach使用引用的陷阱
阅读量:7026 次
发布时间:2019-06-28

本文共 1263 字,大约阅读时间需要 4 分钟。

有时候我们为了在循环过程中改变数组项的值,在foreach的时候变量入口可以加个&符合,

表示,循环过程中使用数组中原来的值,而不是一个复制的值,如

foreach ($array as &$item) {}

  

这样一来,我们在循环中修改$item的值的时候,实际上修改的是$array中对应的值,

而如果不加&符号的话,在循环中修改$item的值不会影响到$array。

 

例子:

$array = [    'name' => 'Jobs',    'age'  => 50,];foreach ($array as $key => $value) {    $value = 22;}print_r($array);foreach ($array as $key => &$value) {    $value = 22;}print_r($array);

  

Array(    [name] => Jobs    [age] => 50)Array(    [name] => 22    [age] => 22)

 

陷阱:两次循环使用同样的临时变量的情况下,如果第一次循环使用的是引用,

那么在第二次循环中即使没有加&符号,临时变量也是引用。

这个引用指向了数组中最后一个元素(循环到了最后一个元素结束)。

 

例子:

$array = [    'name' => 'php',    'age' => 123,];foreach ($array as $key => &$value) {    echo "key=$key, value=$value" . PHP_EOL;}foreach ($array as $key => $value) {    echo "key=$key, value=$value" . PHP_EOL;}

  

key=name, value=phpkey=age, value=123key=name, value=phpkey=age, value=php

  

 上面最后一行的value是"php",并不是我们期望的123,这是因为,在第二个foreach循环中,

每一次循环的时候,都修改了$array中的key为'age'的值,

第一次循环的时候,数组中的age就已经是php(第一个值)了,在后续的循环中会依次改变数组中最后一个值,

到最后一次循环的时候,取得的值是prev($array),也就是php了。

 

如何避免这个问题?

1、在第二次循环之前,unset($value)

2、第二次foreach的时候使用不同名字的变量,如$item

 

另:查看一个变量是否是引用可以使用xdebug_debug_zval函数(需要有xdebug扩展)。

xdebug_debug_zval的结果形如:

value: (refcount=2, is_ref=1)=123

转载于:https://www.cnblogs.com/eleven24/p/7422170.html

你可能感兴趣的文章
时间字符串的转换
查看>>
android sqlite
查看>>
Codeforces Beta Round #18 (Div. 2 Only) C. Stripe 前缀和
查看>>
【ALearning】第二章 Androidproject知识介绍
查看>>
SharePoint 2013 在母版页中插入WebPart
查看>>
CentOs6.5中安装和配置vsftp简明教程
查看>>
eclipse不自动弹出提示(Alt+/ 快捷键失效)
查看>>
JAVA实现AES的加密和解密算法
查看>>
【转】java 自动装箱与拆箱
查看>>
JAVA NIO异步通信框架MINA选型和使用的几个细节(概述入门,UDP, 心跳)
查看>>
【转】android自动化测试之MonkeyRunner使用实例(三)
查看>>
WebService它CXF注释错误(两)
查看>>
ThinkPad E431/E531 ubuntu 14.04 安装无线网卡驱动
查看>>
ABP理论学习之审计日志
查看>>
makefile 学习一
查看>>
jQuery中的Sizzle引擎分析
查看>>
yii 验证码 CCaptcha的总结(转)
查看>>
我的编程之路(二十五) 上海的老同学
查看>>
oracle汉字占用字节长度
查看>>
RIP协议两个版本对不连续子网的支持情况实验
查看>>