这节讲一下关于foreach的一些细节问题,实际开发中可能影响不大,大家最好还是要了解注意下:
细节一:foreach遍历过程中值变量默认的传值方式是值传递:
结果:
下标为1的5并没有变成6,想要把值变量改成引用传递也可以,不要忘记我们的&符号:
foreach($arr as $key => &$val){ ... }
注意下键变量不可以改为引用传递。
细节二:foreach默认是原数组上进行遍历。但如果在遍历过程中对数组进行了某种修改或某种指针性操作,则会复制数组后在复制的数组上继续遍历循环。
做示例前先介绍几个PHP数组函数了解下:
php数组内部都有一个“指针”,指针除了负责foreach循环的位置设定之外,还有其他一些函数也依赖于该指针,并且能移动指针:
1, $v1 = current( $arr); //取得$arr中当前指针所指向的元素的值,如果没有指向元素,则为false
2, $v1 = key($arr); //取得$arr中当前指针所指向的元素的下标,。。。。。false
3, $v1 = next($arr); //将指针移向“下一个元素”,然后取得该下一个元素的值;
4, $v1 = prev($arr); //将指针移向“上一个元素”,然后取得该上一个元素的值
5, $v1 = reset($arr); //将指针移向“第一个元素”,然后取得该元素的值——数组指针初始化
6, $v1 = end($arr); //将指针移向“最后一个元素”,然后取得该元素的值
7, $v1 = each($arr); //取得当前元素的下标和值,然后移动指针到下一个位置。
看这组代码:
结果:
明明在下标为1的时候加了新数据,可foreach循环并没有遍历出新数据来,这是一个值得注意的细节。
foreach中如果值变量是引用传递,则无论如何都是在原数组上进行。
结果:
在下标为1的时候加了新数据,foreach循环遍历出新数据来,因为$arr现在是引用传值数组变量,foreach遍历时它的值变量也是引用传值的。
细节三:foreach遍历的必须是一个数组,foreach不支持自动转换数据类型。
看结果:
在以后写程序时,如果不能确定遍历的变量是一个数组,又不让程序报错,需要做下判断,或者类型转换。
有关数组的其他细节:任一变量取它不存在的下标,有些会报错,有些则不会报错,直接返回NULL。
总结:
1、一个空数组最好使用null,false表示,不建议使用[]。使用[],假如程序后面没有判断$arr是不是空数组,直接用$arr[下标]取值,必然造成程序报错。
2、一个字符串变量取一个索引下标,这个字符串变量的数据会被当做一个索引数组。
对于刚学PHP的朋友对这些细节暂时还引不起注意,这些小细节不注意是会影响一个程序的健全性。