php foreach 使用&(与运算符)引用赋值要注意的问题
首先了解一下“引用赋值”,看一个例子:
<?php <?php
$a=123; $a=123;
$b=$a; $b=&$a;
$a=321; $a=321;
echo"$a,$b"; echo"$a,$b";
?> ?> 结果:321 123 结果:321 321
引用赋值:这意味着新的变量简单的引用(换言之,“成为其别名” 或者 “指向”)了原始变量。改动新的变量将影响到原始变量,反之亦然。
下面看一下要注意的问题,用下面的例子说明:
<?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";
}
?>
结果为:
a4
b4
b4
结果和我期待的不一样,这个就是引用引起的问题。
在 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为2时,这时注意,不是f给$value了,因为此时的$arr[2]的值不是f,而是b4了。
也就是为什么我们所看到的输出结果。
所以在 foreach 使用引用时要注意了。也可以在处理完后立即断开引用关系,后面就不会有上述情况了。
foreach($arr as $value){
$value .= '4';
}
unset($value);
<转载>
php foreach 使用&(与运算符)引用赋值要注意的问题的更多相关文章
- php foreach引用赋值
在写代码时发现php foreach引用赋值会导致意外的行为. 代码示例: <?php $arr = array('a','b','c'); foreach($arr as $k=>&am ...
- [PHP] foreach循环的引用赋值可能导致的问题
foreach($arr as &$value)1.引用赋值符号&,是每次循环的时候,把当前元素变成地址,$value变量就是对应元素的地址,循环结束$value是一个指向最后一个元素 ...
- 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. 基本类型存放在栈区,访问 ...
- PHP变量传值赋值和引用赋值,变量销毁
<?php $a = 100; $b = 200; var_dump($a,$b); //int(100) int(200) ?> php中,上面的代码,变量是怎么存放的呢? 上面的代码变 ...
- python按引用赋值和深、浅拷贝
按引用赋值而不是拷贝副本 在python中,无论是直接的变量赋值,还是参数传递,都是按照引用进行赋值的. 在计算机语言中,有两种赋值方式:按引用赋值.按值赋值.其中按引用赋值也常称为按指针传值(当然, ...
- python如何实现类似php的引用赋值
直接放代码,有注释,就不解析了 # ############################ # 改变一个变量的值,与之有关系的变量的值也会相等变化 # 类似php的引用赋值,宏观来看 # ##### ...
随机推荐
- hdoj 2277 Change the ball【找规律】
Change the ball Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- 查询grep结果的前后n行
linux系统中,利用grep打印匹配的上下几行 如果在只是想匹配模式的上下几行,grep可以实现. $grep -5 'parttern' inputfile //打印匹配行的前后5行 ...
- (一)Eclipse 快捷键
Ctrl+Alt+Down,即可以在下面快速复制一行 Ctrl+Alt+Up,即可以在上面快速复制一行. 1. ctrl+shift+r:打开资源 这可能是所有快捷键组合中最省时间的了.这组快捷键 ...
- xml学习篇(二) ----JSON 和XML对比
在比较JSON和XML之前,我们先来上一堂关于数据格式的简要历史(更准确的说,是关于XML的始祖): 早在1970年,IBM开发了一种叫Generalized Markup Language的标记语言 ...
- The Arduino IDE(compiler)'s float bug
1.通常直接使用串口的print函数就ok Serial.println(DHT.humidity); //assuming DHT.humidity is float 2.但是习惯问题,还是偏好s ...
- [Redux] Persisting the State to the Local Storage
We will learn how to use store.subscribe() to efficiently persist some of the app’s state to localSt ...
- Java_Activiti5_菜鸟也来学Activiti5工作流_之与Spring集成(三)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- linux 简单命令
很久没有接触linux了,很多命令也忘记了,现在自己独立安装一个linux,独立安装LAMP,让自己记录下来这段. 怎么进入命令行 init 3, 回到桌面 init 5在不是root用户情况下,切换 ...
- producer怎样发送消息到指定的partitions
http://www.aboutyun.com/thread-9906-1-1.html http://my.oschina.net/u/591402/blog/152837 https://gith ...
- maven提示错误的解决办法
import或者new一个的maven project的时候,提示如下错误 Description Resource Path Location TypeCannot read ...