之前发过一次微博,今天又遇到这个问题,并且再次犯错,于是决定再加深一下。

就举php.net里的一个例子吧

$a = array('abe','ben','cam');
foreach ($a as $k=>&$n){
$n = strtoupper($n);
}
print_r($a);
foreach ($a as $k=>$n){ // notice NO reference here!
echo "$n\n";
}
print_r($a);

输出的结果是:

Array
(
[0] => ABE
[1] => BEN
[2] => CAM
)
ABE
BEN
BEN
Array
(
[0] => ABE
[1] => BEN
[2] => BEN
)

可以看到第一次foreach()循环以后是正常的,第二次循环以后$a[2]从变成了'BEN',和$a[1]一样。

初看很纳闷,但是如果在第二个foreach()里print_r($a),就很容易明白了,结果如下:

Array
(
[0] => ABE
[1] => BEN
[2] => ABE
) Array
(
[0] => ABE
[1] => BEN
[2] => BEN
) Array
(
[0] => ABE
[1] => BEN
[2] => BEN
)

由于第一个foreach()是用指针指向数组元素,所以循环结束后变量$n依然指向数组$a的最后一个元素,也就是$a[2]。

第二个foreach()里,第一次循环就将$a[0]的值'ABE'赋给$n,第二次又将$a[1]的值'BEN'赋给$n,其实这两次修改的都是$a[2]这个元素,第三次等于没有变化,所以$a[2]无辜地被修改了三次,导致最后的结果。

由此可见,如果foreach()中用指针指向数组元素,循环结束后最好销毁指针,以免后面再次用到重名的变量导致数组的值被无辜修改。

PS:之前的微博如下:

最新文章

  1. JavaScript URL编码转换函数 encodeURIComponent()
  2. VC++ 应用程序无法正常启动0xc0150002
  3. [Flex] PopUpButton系列 —— 弹出菜单的行高设置
  4. homework-04 单词方阵
  5. Ajax调用webService(一) 不跨域。
  6. 【原创】leetCodeOj --- Copy List with Random Pointer 解题报告
  7. 第二次讨论——响应式设计、布局技巧、css性能优化、css预处理
  8. Fourinone 作者博客 -集群复制
  9. AFNetWorking发送post请求,Code=-1016错误
  10. 超全!整理常用的iOS第三方资源
  11. Android开发系列之adb常用命令
  12. Git的使用-如何将本地项目上传到Github
  13. 在Java Web项目中添加定时任务
  14. 紧急疏散evacuate
  15. js 设备判断(移动端pc端 安卓ios 微信)
  16. centos安装make
  17. PHP实现二分法查找
  18. Oracle查询CLOB字段类型的内容
  19. ORACLE 归档日志打开关闭方法
  20. 编译Linux内核(Mac OS平台)

热门文章

  1. hadoop 3.x 无法访问hdfs(50070,8088)的web界面
  2. Ubuntu下一个python的BeautifulSoup和rsa安装方法---信息检索project2部分:微博爬行要求python包裹
  3. ANT下载与安装--windows
  4. Swift过程控制和功能
  5. 各种图示的介绍及绘制(boxplot、stem)
  6. Java 中override、overload、overwrite区别,以及与多态的关系【转】
  7. Netty源代码学习——EventLoopGroup原理:NioEventLoopGroup分析
  8. C++第11周(春)项目4 - 类族的设计
  9. WPF文字描边的解决方法(二)——支持文字竖排和字符间距调整
  10. VirtualBox虚拟机网络环境Host-Only(对Win10和VirtualBox都有截图)