foreach 使用&引用赋值要注意的问题
<?php
$arr = array('a', 'b', 'c');
$arr2 = array('d', 'e', 'f'); foreach($arr as &$value){
$value .= '4';
} foreach($arr2 as $value){
}
//print_r($arr);exit; foreach($arr as $value){
echo $value, "\n";
}
?>
结果为:
结果和我期待的不一样,这个就是引用引起的问题。
在 foreach($arr as &$value) 数组遍历到最后,引用关系并没有断开,这是等同于 $value 是 $arr 的最后一个单元即 $arr[2] 的引用。
再到 foreach($arr2 as $value),$value的值一直随数组单元的值变,由于引用关系没有断开,$arr[2] 的值也跟着变化。一直到$arr2遍历完,这时$value的值为f,所以$arr[2]值也为f。
这时$arr的值应为:
- Array
- (
- [0] => a4
- [1] => b4
- [2] => f
- )
再到 foreach($arr as $value),由于$value 是 $arr[2] 的引用,同理,这时 $arr[2] 的值也随着 $value 变化。
1、遍历到key为0时,a4 给 $value,此时$arr[2]值为a4
2、遍历到key为1时,b4 给 $value,此时$arr[2]值为b4
3、遍历到key为3时,这时注意,不是f给$value了,因为此时的$arr[2]的值不是f,而是b4了。
也就是为什么我们所看到的输出结果。
所以在 foreach 使用引用时要注意了。也可以在处理完后立即断开引用关系,后面就不会有上述情况了。
- foreach($arr as $value){
- $value .= '4';
- }
- unset($value);
foreach 使用&引用赋值要注意的问题的更多相关文章
- php常见问题-foreach和引用造成的问题。
结论: foreach($arr as &$v) 类似这样的引用循环, 脚本语言需要注意,再次使用 $v时,他还指向原来的引用.会产生问题. unset($v)可以解除引用. 所以循环引用过 ...
- php foreach引用赋值
在写代码时发现php foreach引用赋值会导致意外的行为. 代码示例: <?php $arr = array('a','b','c'); foreach($arr as $k=>&am ...
- php foreach 使用&(与运算符)引用赋值要注意的问题
首先了解一下“引用赋值”,看一个例子: <?php <?php $a=123; $a=123; $b=$a; $b=&$a; $a=321; $a=321; echo"$ ...
- [PHP] foreach循环的引用赋值可能导致的问题
foreach($arr as &$value)1.引用赋值符号&,是每次循环的时候,把当前元素变成地址,$value变量就是对应元素的地址,循环结束$value是一个指向最后一个元素 ...
- PHP关于foreach使用引用变量的坑
写PHP好多年,但仍然会犯低级错误,今天遇到个 foreach中引用变量时的坑,PHP版本为 5.6.12 代码如下: <?php $arr = ['a', 'b', 'c', 'd', 'e' ...
- PHP引用赋值
<?php/** * 在PHP 中引用的意思是用不同的名字访问同一个变量内容 * 只有有名字的变量才可以引用赋值,否则会报错 * 引用赋值 不是在内存上同体,只是把各自的值关联起来 * unse ...
- PHP二维数组的引用赋值容易犯的错误
大家一起来分析一下下面这段代码: <?php $arr = array(); $arr["abc"] = array("sex" => 100, & ...
- python之局部变量引用赋值前的结果
通过正则表达式,实现加减 昨晚在做计算器的时候,被一个BUG搞懵比了.现在再看看,发现我好小白啊~~ #++- num = input("please input:") sa = ...
- Js的引用赋值与传值赋值
要说js的赋值方式时首先要说明js的数值类型:基本类型和引用类型. 1.基本类型 基本的数据类型有:undefined,boolean,number,string,null. 基本类型存放在栈区,访问 ...
随机推荐
- JNI学习笔记_C调用Java
一.笔记 1.C调用Java中的方法,参考jni.pdf pg97可以参考博文:http://blog.csdn.net/lhzjj/article/details/26470999步骤: a. 创建 ...
- mybatis 生成 映射文件生成工具 mybatisGenerator 使用
第一:新建 generatorConfig.xml 文件 ,写入下面的 内容 <?xml version="1.0" encoding="UTF-8"?& ...
- CC2530低功耗设置(针对终端设备)
一. 终端设备只完成发送数据 1.开启POWER_SAVING 预编译 2.f8wConfig_cfg 中的RFD_RCVC_ALWAYS_ON=FALSE 3.f8wConfig_cfg中四个DPo ...
- 捕获长时间不提交的SQL语句
/* Formatted on 2014/5/19 17:16:16 (QP5 v5.240.12305.39476) */ SELECT s.sid, s.serial#, ss.sql_text ...
- 微信小程序开发(request请求后台获取不到data)
1微信的request的post请求后台获取不到data(当初这个问题纠结了好久好久),原因是post传递的data是json格式而不是key,value的格式,所以获取不到相应的data就是post ...
- android自定义tabhost,tabcontent用intent获得
地址:http://my.oschina.net/aowu/blog/36282 自己改的自定义tabhost组建,效果图如左.有更好的朋友可以相互交流一下,嘿嘿. 1.先上AndroidManife ...
- C++将整型数据转换成大端或小端存储顺序
大端和小端的概念参考之前博客: 大端/小端,高字节/低字节,高地址/低地址,移位运算 昨晚帮导师从指令中恢复图像的时候,导师要我转换成raw格式,也就是记录图像像素的二进制序列,然后反复强调让我注意大 ...
- gc之六--Minor GC、Major GC、Full GC以及Mixed GC之间的区别
目录: GC之一--GC 的算法分析.垃圾收集器.内存分配策略介绍 GC之二--GC日志分析(jdk1.8)整理中 GC之三--GC 触发Full GC执行的情况及应对策略 gc之四--Minor G ...
- [转]C# 安装布署
C# 安装布署 及Windows服务自动启动 分类: asp.net2009-09-23 10:43 1126人阅读 评论(0) 收藏 举报 windowsc#serviceobject服务器 设置s ...
- eterm和easyfare的官网地址
里面有eterm下载和eterm文档资料 运价软件easyfare和easyfare的文档. https://www.eterm.com.cn/caci/eterm/index-cn.jsp http ...