有几种不同的数组遍历方式,根据数组的特点可以选择合适的方式进行遍历,其中有一种通过while函数与一些可操作数组内部指针的函数实现遍历的方式,但是在使用中需要注意一些问题。
常见的使用此方式的代码如下:
do{
echo key($arr)."=>".current($arr)."\n";
}while(next($arr));
这样的方式有两个问题,一个是无论数组是否为空数组都至少执行一次,这样显然不是很合适,第二则是对于是否遍历结束的判断,next函数将数组中的内部指针向前移动一位,然后返回当前指针处单元的值,如果单元不存在则返回false。但是反过来next函数返回false并不能认定数组指针已经到达数组结尾,因为有可能单元本身为false,或者等同于false的非布尔值,即使使用严格比较也是无法判断的。prev函数与之类似。
比如,如果数组$arr为如下数组:
$arr=array("a"=>"a",1=>"b",false=>"c",3=>false,"d",null=>false,"f");
此时执行上面的代码返回结果如下:
a=>a
1=>b
0=>c
显然在未到达数组结尾时就停止了遍历。
正确的遍历方式应该如下:
while(key($arr)!==null){
echo key($arr)."=>".current($arr)."\n";
next($arr);
}
key函数返回数组内部指针指向的当前单元的键名,如果内部指针超出了元素列表范围或者是空数组,则返回null。由数组的定义可知,当数组的key为非整型或字符串类型时会进行强制转换,布尔值转换为整型,true为1,false为0,Null转换为空字符串。所以如果key函数返回值严格等于null时,就证明数组指针到达了数组末尾。
执行结果如下:
a=>a
1=>b
0=>c
3=>
4=>d
=>
5=>f