首先了解一下“引用赋值”,看一个例子:

<?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);

<转载>

最新文章

  1. U盘安装centos7 无法进入安装界面,进入dracut命令的解决办法。
  2. EXPORT_SYMBOL的使用
  3. Java知识点归总一之堆栈
  4. Servlet知识
  5. js Date 时间格式化的扩展
  6. Android使用SAX解析XML(4)
  7. python 特殊的下划线
  8. 高手看了,感觉惨不忍睹——关于“【ACM】杭电ACM题一直WA求高手看看代码”
  9. Linux访问Windows磁盘实现共享
  10. MXNet符号编程
  11. hdu 4192
  12. 《学习OpenCV》 第四章 习题六
  13. leetcode Search for a Range python
  14. Linux常用命令--网络管理篇(三)
  15. Mysql配置文件my.cnf详细说明
  16. SQL之case when then用法(用于分类统计)
  17. Vue(小案例_vue+axios仿手机app)_Vuex优化购物车功能
  18. Win10下VirtualBox安装流程
  19. SpirngBoot之整合Swagger2
  20. WebForm使用FileUpload控件上传压缩二进制图片

热门文章

  1. HBase 简介(强烈推荐看)
  2. ArrStack——数组栈(procedure)
  3. Javac编译和JIT编译
  4. 原生JavaScript的省市县三级联动
  5. python之json学习
  6. 经典SQL语句大全之提升
  7. [Redux] Navigating with React Router &lt;Link&gt;
  8. android 56
  9. Cocos2d各版本搭建环境中的奇葩操作
  10. 第五篇:python基础之循环结构以及列表