数组的遍历
在PHP中,很少需要自己动手将大量的数据声明在数组中,而是通过调用系统函数获取。使用数组的目的,就是将多个相互关联的数据,组织在一起形成集合,作为一个单元使用,达到批量数据处理的目的。也有很少部分是在程序中直接访问数组中每个成员,而大部分数组都需要使用遍历一起处理数组中的每个元素。
1、使用for语句循环遍历数组
在其他编程语言中,数组的遍历通常都是使用for循环语句,通过数组的下标来访问数组中每个成员元素,但要求数组的下标必须是连续的数字索引。而在PHP中,不仅可以指定非连续的数字索引值,而且还存在以字符串为下标的关联数组,所以在PHP中很少使用for语句循环遍历数组。在遍历多维数组时,要使用循环嵌套逐层进行遍历。
2、使用foreach语句遍历数组
PHP4中引入了foreach结构,是PHP中专门为遍历数组而设计。使用foreach语句遍历数组时与数组的下标,不管是否是连续的数字索引数组,还是以字符串为下标的关联数组,都可以使用foreach语句遍历。foreach只能用于数组。自PHP5起,还可以遍历对象。当试图将其用于其他数据类型或一个未初始化的变量时会产生错误。
第一种语法格式:
foreach(array_expression as $value){
循环体
}
第二种语法格式
foreach(array_expression as $key=>$value){
循环体
}
每次循环中,当前元素的值被赋给变量$value,并且把数组内部的指针向后移动一步,因此下一次循环中将会得到该数组的下一元素,直到数组的结尾停止循环,结束数组的遍历。
3、联合使用list()、each()和while循环数组
1、each()函数
each()函数需要传递一个数组作为参数,返回数组中当前元素的键\值对,并向后移动数组指针到下一个元素的位置。键\值对呗返回为带有4个元素的关联和索引混合的数组,键名分别为0、1、key和value。其中键名0和key对应的值是一样的,是数组元素的键名,1和value则包含有数组元素的值。如果内部指针越过了数组的末端,则each()返回FALSE。
2、list()函数
这不是真正的函数,而是PHP的语言结构。list()用进一步操作给一组变量进行赋值,即把数组中的值赋给一些变量。list()技能用于数字索引的数组并假定数字索引从0开始。
list(mixed varname, mixed ……) = array_expression
list()语句和其他函数在使用上有很大的区别,并不是直接接收一个数组作为参数,而是通过“=”运算符以赋值的方式,将数组中每个元素的值,对应的赋给list()函数中的每个参数。list()函数又将它中的每个参数转为直接可以在脚本中使用的变量。
3、while循环遍历数组
while ( list ($key, $value) = each(array_expression)){
循环体
}
在while()语句每次循环中,each()语句将当前数组元素中的键赋给list()中的第一个参数变量$key,并将当前数组元素中的值赋给list()中的第二个参数变量$value,并且each()语句执行后还会把数组内部的指针向后移动一步,因此下一次while()语句循环时,将会得到该数组中下一个元素的键\值对,直到数组的结尾each()语句返回FALSE,while()语句停止循环,结束数组的遍历。
虽然while遍历数组的结果和foreach语句相同,但是两者是有区别的。在使用while语句遍历数组之后,each()语句已经将传入的数组参数内部指针指向了数组的末端。当再次使用while语句遍历同一个数组时,数组指针已经在数组的末端,each()语句直接返回FALSE,while()语句不会执行循环,只有在while语句执行之前先调用一下reset()函数,重新将数组指针指向第一个元素。而foreach语句会自动重置数组的指针位置,当foreach开始执行,数组内部的指针会自动指向第一个单元,这意味着不需要再foreach循环之前调用reset()函数。
4、使用数组的内部指针控制函数遍历数组
数组的内部指针是数组内部的住址机制,指向一个数组中的某个元素。默认是指向数组中第一个元素,通过移动或改变指针的位置,可以访问数组中的任意元素。
(1)current():取得目前指针位置的内容资料;
(2)key():读取目前指针所指向资料的索引值;
(3)next():将数组中的内部指针移动到下一个单元;
(4)prev():将数组的内部指针倒回一位;
(5)end():将数组的内部指针指向最后一个元素;
(6)reset():将目前指针无条件移至第一个索引位置。