好久没有学习PHP了,最近几天忙的晕头转向,今天继续学习PHP数组的游标操作。
数组有N个单元,同时只能操作一个单元。比如循环时,只能一个一个单元读取他的值。
那么数组是怎么记住刚才读取的是哪个单元,接着读取下个单元的呢?
在数组内部,有一个指针,指针指向某一个单元。
每循环一个单元,指针向尾部移动。
游标操作函数:current(),key(),next(),prev(),reset(),end()
$arr = array(‘中’,’华’,’人’,’民’);
current()是“当前”的意思,该函数作用是取出数组内部指针指向单元的“值”。
echo current($arr),'<br />';//运行结果是’中’,数组刚创建,指针初始化指向第0个单元。
echo current($arr),'<br />';//运行结果还是’中’,因为数组内部的指针并未向尾部移动。
key()函数作用是取出数组内部指针指向单元的“键”。
echo key($arr),'<br />';//
echo key($arr),'<br />';//此时指针,还是指向第0个单元。
next()是“下一个”的意思,作用是将数组内部指针向尾部移动一个单元。
next($arr);
echo current($arr),'<br />';//华
echo key($arr),'<br />';//1
next($arr);
echo current($arr),'<br />';//人
echo key($arr),'<br />';//2
next($arr);
echo current($arr),'<br />';//民
echo key($arr),'<br />';//3
next($arr);
var_dump(current($arr));//bool(false)
var_dump(key($arr));//NULL
next($arr);
var_dump(current($arr));//bool(false)
var_dump(key($arr));//NULL
能不能从后往前打印单元的键和值?
即指针先指向最后,逐渐往头部移动指针。
默认时,指针是指向第0个单元。
要想达到效果,需要先使指针指向最后一个单元。
然后,把指针往头部移动。
end()函数作用是把指针指向数组的最后一个单元。
prev()函数作用是把指针向头部移动一个单元。
end($arr);
echo current($arr),'<br />';//民
echo key($arr),'<br />';//3
prev($arr);//指针向头部移动一下
echo current($arr),'<br />';//人
echo key($arr),'<br />';//2
prev($arr);//指针向头部移动一下
echo current($arr),'<br />';//华
echo key($arr),'<br />';//1
prev($arr);//指针向头部移动一下
echo current($arr),'<br />';//中
echo key($arr),'<br />';//0
prev($arr);//指针向头部移动一下
var_dump(current($arr));//bool(false)
var_dump(key($arr));//NULL
如果数组有1000个单元,总不能一直prev($arr);或者next($arr);一千次吧?
如何利用next(),prev()自动循环数组?
不管数组指针指向哪里,用reset()可以使数组内部指针指向第0个单元。
reset($arr);
echo current($arr),key($arr),'<br />';中0
next($arr);
next($arr);
echo current($arr),key($arr),'<br />';人2
reset($arr);
echo current($arr),key($arr),'<br />';中0
不用foreach,就用for循环来循环数组
$arr = array(‘name’ => ‘张三’,’age’ => ’28’,height => ‘176’,area => ‘山西’);
用之前的知识,用for循环没办法循环此数组。
但结合游标操作后,就可以实现:
for(;current($arr);next($arr)){
echo key($arr),’~’,current($arr),'<br />';
}
用for循环也能循环数组。
这里只是为了练习数组游标操作,在实际开发中,推荐用foreach。
如何打印一个单元,跳一个单元,再打印?
$arr = array(‘中’,’华’,’人’,’民’,’共’,’和’,’国’);
for(;current($arr);next($arr),next($arr)){
echo key($arr),’~’,current($arr),'<br />';
}
如何跳两个单元,打印,再退一个单元,再打印?
echo ‘<hr />';
reset($arr);//这句话什么用?
for($flag = true;current($arr);){
echo current($arr),'<br />';
if($flag){
next($arr);
next($arr);
$flag = false;
}else{
prev($arr);
$flag = true;
}
}
$arr = array(‘a’,’b’,’c’,’d’);
echo current($arr),'<br />';//a
foreach($arr as $v){
echo $v,'<br />';
}
var_dump(current($arr));//bool(false);
//第一个foreach已经把指针往后移出界了。
//foreach循环结束后,并没有把内部指针初始化。
foreach($arr as $v){
echo $v,'<br />';
}//第一个foreach应该把内部指针移到尾部了,第二个foreach,有没有受第一个foreach的影响?
答:foreach在运行前,会自动reset($arr);,因此不会受上一次的影响。
foreach循环结束后,会不会把数组内部指针reset()?
答:不会,第9行可以证明。
指针循环数组的陷阱
$arr = array(0,1,2,3);
for(;current($arr);next($arr)){
echo current($arr);//没有结果,0相当于false,循环跳出。
}
如果数组某单元的值为””,0,false,’0′,null,都将导致循环退出,怎么办?
用each解决,欲知详情,且听下回PHP学习笔记之list与each。