PHP中foreach循环中使用引用要注意的地方
2015-01-24信息快讯网
发现了一个容易出错,但是不懂得原理却解释不明白的问题,碰到类似问题的朋友可以参考下。
foreach ($array as &$row) { $row = explode('/', $row); } foreach ($array as $row) { //do something }
这么写,在第二个循环会出逻辑错误,加入第二个循环中do something的地方是输出$row,循环到最后一个的时候的输出是倒数第二个元素,而不是最后一个
要这么写
foreach ($array as &$row) { $row = explode('/', $row); } unset($row); foreach ($array as $row) { //do something }
或者第一个循环这么写
foreach ($array as $key => $row) { $array[$key] = explode('/', $row); }
说一下原理
第一个循环使用了引用,循环结束后,$row引用的是$array数组的最后一个元素,当开始第二个循环的时候,$row变量每次循环都会被赋一个新值,在php中,如果一个内存空间是被引用的,那么当改变它的时候是直接改变这块内存空间的值,也就是说,当第二个foreach的第一次循环,$array的最后一个元素的值就被改变为$array的第一个元素的值,第二次循环的时候,改变为第二个元素的值,倒数第二次循环的时候,被改变为倒数第二个元素值,而最后一次循环的时候得道的值必然是那个倒数第二个值
当然,如果php的for循环有作用域的话,也不会出现此问题.....
php引用地址改变变量值的问题
奇怪的PHP引用效率问题分析
php地址引用(php地址引用的效率问题)
for循环连续求和、九九乘法表代码
几种有用的变型 PHP中循环语句的用法介绍
PHP循环语句笔记(foreach,list)
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
php中用foreach来操作数组的代码
php入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
ajax 的post方法实例(带循环)
使ecshop模板中可引用常量的实现方法
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
PHP错误抑制符(@)导致引用传参失败Bug的分析
PHP中for与foreach的区别分析
深入理解PHP之require/include顺序 推荐
PHP开发中四种查询返回结果分析
php 传值赋值与引用赋值的区别
php foreach 参数强制类型转换的问题
一道关于php变量引用的面试题
用PHP实现递归循环每一个目录
PHP 数组遍历方法大全(foreach,list,each)
PHP 循环列出目录内容的函数代码
php for 循环语句使用方法详细说明
PHP foreach循环使用详解与实例代码
PHP中冒号、endif、endwhile、endfor使用介绍
Smarty Foreach 使用说明
PHP提取数据库内容中的图片地址并循环输出
PHP 引用是个坏习惯
PHP 引用文件技巧
php foreach 使用&(与运算符)引用赋值要注意的问题