第四章:第28节 PHP数据类型-数组之foreach遍历细节探讨✪,这节很重要

更新于:2018-11-02 14:24:35

这节讲一下关于foreach的一些细节问题,实际开发中可能影响不大,大家最好还是要了解注意下:


细节一:foreach遍历过程中值变量默认的传值方式是值传递:


1.png

结果:

1.png


下标为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.png

结果:

1.png

明明在下标为1的时候加了新数据,可foreach循环并没有遍历出新数据来,这是一个值得注意的细节。


foreach中如果值变量是引用传递,则无论如何都是在原数组上进行。


1.png

结果:

1.png

在下标为1的时候加了新数据,foreach循环遍历出新数据来,因为$arr现在是引用传值数组变量,foreach遍历时它的值变量也是引用传值的。


细节三:foreach遍历的必须是一个数组,foreach不支持自动转换数据类型。 


1.png


看结果:


1.png


在以后写程序时,如果不能确定遍历的变量是一个数组,又不让程序报错,需要做下判断,或者类型转换。


有关数组的其他细节:任一变量取它不存在的下标,有些会报错,有些则不会报错,直接返回NULL。


1.png


1.png

总结:


1、一个空数组最好使用null,false表示,不建议使用[]。使用[],假如程序后面没有判断$arr是不是空数组,直接用$arr[下标]取值,必然造成程序报错。


2、一个字符串变量取一个索引下标,这个字符串变量的数据会被当做一个索引数组。


对于刚学PHP的朋友对这些细节暂时还引不起注意,这些小细节不注意是会影响一个程序的健全性。


本节学习代码》》》