<?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的值应为:

    1. Array  
    2. (  
    3. [0] => a4  
    4. [1] => b4  
    5. [2] => f  
    6. )

    再到 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 使用引用时要注意了。也可以在处理完后立即断开引用关系,后面就不会有上述情况了。

    1. foreach($arr as $value){  
    2. $value .= '4';  
    3. }  
    4. unset($value);

    foreach 使用&引用赋值要注意的问题的更多相关文章

    1. php常见问题-foreach和引用造成的问题。

      结论:  foreach($arr as &$v) 类似这样的引用循环, 脚本语言需要注意,再次使用 $v时,他还指向原来的引用.会产生问题. unset($v)可以解除引用. 所以循环引用过 ...

    2. php foreach引用赋值

      在写代码时发现php foreach引用赋值会导致意外的行为. 代码示例: <?php $arr = array('a','b','c'); foreach($arr as $k=>&am ...

    3. php foreach 使用&(与运算符)引用赋值要注意的问题

      首先了解一下“引用赋值”,看一个例子: <?php <?php $a=123; $a=123; $b=$a; $b=&$a; $a=321; $a=321; echo"$ ...

    4. [PHP] foreach循环的引用赋值可能导致的问题

      foreach($arr as &$value)1.引用赋值符号&,是每次循环的时候,把当前元素变成地址,$value变量就是对应元素的地址,循环结束$value是一个指向最后一个元素 ...

    5. PHP关于foreach使用引用变量的坑

      写PHP好多年,但仍然会犯低级错误,今天遇到个 foreach中引用变量时的坑,PHP版本为 5.6.12 代码如下: <?php $arr = ['a', 'b', 'c', 'd', 'e' ...

    6. PHP引用赋值

      <?php/** * 在PHP 中引用的意思是用不同的名字访问同一个变量内容 * 只有有名字的变量才可以引用赋值,否则会报错 * 引用赋值 不是在内存上同体,只是把各自的值关联起来 * unse ...

    7. PHP二维数组的引用赋值容易犯的错误

      大家一起来分析一下下面这段代码: <?php $arr = array(); $arr["abc"] = array("sex" => 100, & ...

    8. python之局部变量引用赋值前的结果

      通过正则表达式,实现加减 昨晚在做计算器的时候,被一个BUG搞懵比了.现在再看看,发现我好小白啊~~ #++- num = input("please input:") sa = ...

    9. Js的引用赋值与传值赋值

      要说js的赋值方式时首先要说明js的数值类型:基本类型和引用类型. 1.基本类型 基本的数据类型有:undefined,boolean,number,string,null. 基本类型存放在栈区,访问 ...

    随机推荐

    1. OASGraph 转换rest api graphql 试用

      创建rest api lb4 appdemo 参考提示即可 安装 OASGraph git clone https://github.com/strongloop/oasgraph.git cd oa ...

    2. 一个5.0/3.3V双向通讯的电路

      来自群友 西江月-梧州 的分享 硬件程工-深圳福永(79993868) 17:06:33 当3.3V高时二极管阳极为3.3V,阴极接了10K上拉为5V,二极管的压降为反向,此时二极管不导通. 硬件程工 ...

    3. mysql ssh 端口转发

      某些时候 mysql  只允许 指定的 ip连接 .这时候怎么在本机 连接mysql 的呢? 条件 1 mysql 只有 允许 指定ip连接 2 有连接 指定 ip 服务器的  账密 这时候我们可以通 ...

    4. win10激活命令

      以管理员方式打开命令提示符输入以下3条命令slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX 按回车slmgr /skms 54.223.212.31 按回车slmgr ...

    5. Rockchip parameter文件详解

      瑞芯微的安卓平台使用 parameter 文件来配置一些系统参数,比如定义串口号,固件版本,flash分区信息等. parameter 文件是由 BootLoader 解析的,大小不能超过 64 KB ...

    6. google code 或 git 免用户名和密码 .netrc 在windows中的操作 _netrc

      1.首先用不包含用户名URL CLONE “git clone https://code.google.com/p/YourProjName/” .而不能用 “git clone https://Yo ...

    7. 安卓秘钥生成命令以及SHA1值获取办法

      切换到秘钥所在目录,例如:cd C:\Program Files\Java\jdk1.8.0_171\bin 执行命令:keytool -genkey -alias demo.keystore -ke ...

    8. $.meta ? $.extend({}, opts, $this.data()) : opts 是什么

      问:$.meta ? $.extend({}, opts, $this.data()) : opts 是什么 答:这应该是一个jQuery扩展插件中的代码,其中运用了三目运算符,以及jQuery的ex ...

    9. CA证书认证单向和双向的区别

       我觉得最科学的应该是,单向的,每次客户端发两把锁住的东西给服务端,服务端解密两次,服务端用客户端发来的对称密钥加密数据,发送给客户端,客户端只需解密一次,然后客户端每次修改随机密码,传给服务端,服务 ...

    10. 统计numpy数组中每个值的个数

      import numpy as np from collections import Counter data = np.array([1.1,2,3,4,4,5]) Counter(data) #简 ...