<?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. python安装途中遇到的问题和解决方法

      一.setuptools安装错误:RuntimeError: Compression requires the (missing) zlib module 1. 描述 搞了个腾讯云的服务器,闲在手上没 ...

    2. MySql初试

      初次使用MySql感觉有点不方便,习惯了使用MS Sql Server带来的便利,话不多说直接进入主题. 第一步.下载MySQL Community Server,下载地址:https://dev.m ...

    3. enjoy dollar vs cash dollar

      當 enJoy 卡 客 戶 憑 enJoy 卡 於 enJoy 卡 「 特 約 商 戶 」 簽 賬 消 費 , 累 積 之 enJoy Dollars 及 Cash Dollars 可 在 同 一 交 ...

    4. 小米盒子root及sshdroid安装

      1.root 参考屌丝猫的教程 主要原理是通过运行自定义recovery实现root功能 2.安装sshdroid以及幸运破解器 3.使用幸运破解器吧sshdroid编程系统应用,从而实现自启动

    5. Mac 下 java环境 maven环境配置

      java环境配置 下载jdk,按照提示安装 我下的是1.8.0版本,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8- ...

    6. linq to sql 项目移植后,数据库实体类需要重新创建?

      项目中,使用LINQ to SQL 访问数据库,代码移植到其他机器上,每次需要重新生成dbml文件,有无方法只要更改app.config呢? 经过试验是可行的: 1.引用system.configur ...

    7. SpringCloud初体验:六、利用 Sleuth 和 Zipkin 给微服务加上链路监控追踪查看功能

      首先:装上 Zipkin 服务,收集调用链跟踪数据,体验时装在了本机docker上, 方便快捷 docker run -d -p : openzipkin/zipkin 安装后访问地址也是 9411端 ...

    8. ORACLE删除某用户下所有对象

      ORACLE删除某用户下所有对象 2013-10-26 15:50 4996人阅读 评论(1) 收藏 举报   --.sql脚本 --唯一注意的是下面的D:\dropobj.sql 为操作的.sql; ...

    9. 开始转型学习java

      什么编程语言这些都是一样的,编程思想都是一样的.只不过是表现形式. 标识符 每一个字符在ascll码表例都有对应的数字 所以字符和数字是可以相加的   'a'+1 也可以显示数字对应的字符   (ch ...

    10. 【C#】教你纯手工用C#实现SSH协议作为GIT服务端

      SSH(Secure Shell)是一种工作在应用层和传输层上的安全协议,能在非安全通道上建立安全通道.提供身份认证.密钥更新.数据校验.通道复用等功能,同时具有良好的可扩展性.本文从SSH的架构开始 ...