在写代码时发现php foreach引用赋值会导致意外的行为。

  代码示例:

  <?php
$arr = array('a','b','c');
foreach($arr as $k=>&$v)
{
}
print_r($arr); foreach($arr as $k=>$v)
{
}
print_r($arr);
?>
    输出结果:
    Array ( [0] => a [1] => b [2] => c ) Array ( [0] => a [1] => b [2] => b )
 
    经过查找资料,找到原因。其实,第一个foreach结束后,数组$arr最后一个元素$v的引用仍然保留。在进行第二个foreach循环时,实际上是对数组$arr的第三个元素的三次赋第二个foreach开始执行时,每次数组$arr的变化如下:
    第一次: Array ( [0] => a [1] => b [2] => a ) 
    第二次: Array ( [0] => a [1] => b [2] => b ) 
    第三次: Array ( [0] => a [1] => b [2] => b ) 
    所以会有最后的输出结果。
 
    为了避免这种情况,可以在第一个foreach结束后,取消掉引用:unset($v)。但是,为了避免不可预期的结果出现,慎用foreach引用赋值。
 
 
 
 

最新文章

  1. 解决java.io.IOException: HTTPS hostname wrong: should be
  2. HID USB设备开发技术【转】
  3. UML分析与设计
  4. 【转】[慢查优化]联表查询注意谁是驱动表 &amp; 你搞不清楚谁join谁更好时请放手让mysql自行判定
  5. servlet核心API的UML图
  6. 求斐波那契数列的第n项
  7. C语言双向链表
  8. python/ Django之中间件
  9. Snakes 的 Na&#239;ve Graph
  10. 简述iproute家族命令
  11. 路由网关---zuul
  12. JS垃圾收集机制
  13. JS应用实例4:表格隔行换色
  14. 如何搭一个vue项目
  15. 每日英语:Hold On: Reasons For Never Giving Up Your Dream
  16. 应用程序挂起、复原与终止— IOS开发
  17. Ubuntu下如何修改文件或者文件夹的权限
  18. CNBlog客户端--第一阶段记录
  19. jQuery 移除绑定事件
  20. FPGA 日积月累

热门文章

  1. Promise的前世今生和妙用技巧
  2. 使用Rest访问Redis中的数据
  3. 【java】jstack
  4. MySQL基础之存储过程
  5. Quartz.net开源作业调度框架使用详解
  6. Python模拟登陆新浪微博
  7. Android动画效果之初识Property Animation(属性动画)
  8. linq to js使用汇总
  9. blocking and unblocking mechanism for linux drivern code
  10. jQuery源码学习感想