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相关知识。
each是“每一个”的意思。
<?php
$arr = array(‘男’,’女’,’老’,’少’);
print_r(each($arr));
?>
分析:第一个单元,键:0,值:男
each的作用是把指针指向的当前单元的信息组成一个数组。
数组有4个单元,具体如下:
array(
1 => ‘单元值’
‘value’ => ‘单元值’
0 => ‘单元的键’
‘key’ => ‘单元的键’
)
array(
1 => ‘男’
‘value’ => ‘男’
0 => 0
‘key’ => 0
)
each不仅把当前指针指向的单元的信息组合成一个数组返回。
并且把指针向尾部移动一次。
因此,下一行打印结果:
array(
1 => ‘女’
‘value’ => ‘女’
0 => 1
‘key’ => 1
)
print_r(each($arr));
返回值是固定的四个单元的数组(0、key、1、value四个单元)。
print_r(each($arr));
print_r(each($arr));//把’幼’打出来,指针再往后移一个单元。
var_dump(each($arr));//bool(false),因为指针已经超出数组界限了。
each 是取出指针所指单元的键和值,组合成一个数组返回。
并把指针向尾部移。
如果,取不出来单元,返回bool(false)。
//循环数组
$arr = array(-3,-2,0,1,2,3);
while($ceil = each($arr)){
//如果能取出单元,则返回1、value、0、key 4个单元的数组,不为假。
//如果指针已经超出界限,返回false,自然while结束
echo $ceil[0].’~’.$ceil[1],'<br />';
}
each经常和list一起用,80%的PHPer都搞不清楚的一个问题。
list是复合赋值语句,可以一次性为多个变量赋值。
$arr = array(‘东’,’南’,’西’,’北’);
下面,是常见的操作,即把数组的单元值赋给多个变量。
$east = $arr[0];
$south = $arr[1];
$west = $arr[2];
$north = $arr[3];
//上面的这个过程,用4次赋值,把数组4个单元值,赋给4个变量,麻烦!
echo $east,$south,$west,$north,'<br />';
//把春夏秋冬赋给4个变量
$arr = array(‘春’,’夏’,’秋’,’冬’);
list($spring,$summer,$fall,$winter) = $arr;
echo $spring,$summer,$fall,$winter,'<br />';
list($a,$b,$c) = array(2 => ‘赵’,3 => ‘钱’,1 => ‘孙’);
var_dump($a); echo $b,$c,'<br />';//null孙赵
list是如何工作的?
因为list能够给多个变量赋值,即把数组的多个单元值分别赋给多个变量。
那么,自然要注意1个最重要的地方。
即把数组的单元值“对应”赋给某个变量。
具体“对应”如下:
在list中,按’,’隔开的顺序,从左到右,分别对应右侧数组(设为$arr)
$arr[0],$arr[1],$arr[2]….$arr[N]
如果需要对应的数组单元不存在,怎么办?
答:依然是依次对应,不存在,当成NULL处理。
$a <====> $arr[0]
$b <====> $arr[1]
$c <====> $arr[2]
映射工作完成!
开始赋值!
赋值的过程,和映射的顺序是反的,是从右往左赋值。
$c = $arr[2];
$b = $arr[1];
$a = $arr[0];
$c = ‘赵’;
$b = ‘孙';
$a = NULL;//$arr[0]不存在。
赋值完毕!
因此,最终打印 NULL孙赵。
仔细判断,打印$arr的结果:
list($arr[0],$arr[1],,$arr[2]) = array(3 => ‘赵’,1 => ‘钱’,5 => ‘孙’,2 => ‘李’,0 => ‘燕’);
print_r($arr);
分析:
先从左到右来对应着分配值:
$arr[0] <====> array[0]
$arr[1] <====> array[1]
$arr[2] <====> array[3]
分配完毕,开始赋值!
从右到左赋值
$arr[2] = 赵;
$arr[1] = 钱;
$arr[0] = 燕;
数组打印,并不是如你所想,按索引的大小来打印,
而是按创建时的顺序来打印。
因此,最终打印
array(
2 => ‘赵’,
1 => ‘钱’,
0 => ‘燕’
)
用each,list自己写一个模拟foreach的函数
function for_each($arr){
while($tmp = each($arr)){
list($k,$v) = $tmp;
echo $k,$v,'<br />';
}
}
$arr = array(‘虎’,’驴’,’马’,’狼’);
for_each($arr);
PHP学习笔记之数组游标操作的更多相关文章
- 树莓派学习笔记——使用文件IO操作GPIO SysFs方式
0 前言 本文描写叙述假设通过文件IO sysfs方式控制树莓派 GPIO端口.通过sysfs方式控制GPIO,先訪问/sys/class/gpio文件夹,向export文件写入GPIO编号, ...
- PHP学习笔记之数组篇
摘要:其实PHP中的数组和JavaScript中的数组很相似,就是一系列键值对的集合.... 转载请注明来源:PHP学习笔记之数组篇 一.如何定义数组:在PHP中创建数组主要有两种方式,下面就让我 ...
- Windows phone 8 学习笔记(2) 数据文件操作
原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...
- JavaScript学习笔记之数组(二)
JavaScript学习笔记之数组(二) 1.['1','2','3'].map(parseInt) 输出什么,为什么? ['1','2','3'].map(parseInt)//[1,NaN,NaN ...
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
- python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...
- Android:日常学习笔记(10)———使用LitePal操作数据库
Android:日常学习笔记(10)———使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式 ...
- Python3+Selenium3+webdriver学习笔记13(js操作应用:弹出框无效如何处理)
#!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记13(js操作应用:弹出框无效如何处理)'''from sel ...
- Python3+Selenium3+webdriver学习笔记12(js操作应用:滚动条 日历 内嵌div)
#!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记12(js操作应用:滚动条 日历 内嵌div)'''from ...
随机推荐
- [BJWC2011]元素 线性基
题面 题面 题解 一个方案合法,当且仅当选取的01串凑不出0. 因此就是要使得选取的01串全在线性基内,具体原因可以看这道题:[CQOI2013]新Nim游戏 线性基 要使得魔力值最大,只需要按法力值 ...
- NLP度量指标BELU真的完美么?
摘要: NLP重要评价准则之一——BLEU,真的完美无缺么? 刚接触自然语言处理的朋友通常会问我:当系统的输出是文本,而非对输入文本进行某种分类,如何对该系统进行评估.当模型的输入是文本信息,输出也是 ...
- Java判断一个字符串str不为空:方法及时间效率
判断一个字符串str不为空的方法有: 1.str == null; 2.”“.equals(str): 3.str.length <= 0; 4.str.isEmpty(): 注意:length ...
- Unity3D实现3D立体游戏原理及过程
Unity3D实现3D立体游戏原理及过程 183 0 0 下面的教程是我今天整理的资料,教大家一步步完成自己的3D立体游戏,并向大家介绍一些3D成像的原理. 理论上,每个普通的非立体3 ...
- CODECHEF Chef and Churus 解题报告
[CODECHEF]Chef and Churus Description 有一个长度为\(n\)的数组\(A\),有\(n\)个函数,第\(i\)个函数的值为\(\sum_{j=l_i}^{r_i} ...
- max os x lighttpd + php + mysql 部署
手贱,升级了max os x 到Yosemite,系统默认装了nginx,php,开机会自动启动!1 开机启动脚本默认在下面位置: /Library/LaunchDaemons/com.root.ng ...
- https的通信过程
https的特点 1. https有 握手阶段 和 请求阶段2. 握手阶段 使用 非对称加密算法 请求阶段 使用 对称加密算法3. 保证数据的完整性使用数字签名4. 握手阶段有两组非对称加密,数字证书 ...
- java rmi远程方法调用实例
RMI的概念 RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制.使用这种机制,某一台计算机上的对象可以调用另外一台计 ...
- CCPC2018-A-Buy and Resell
Problem Description The Power Cube is used as a stash of Exotic Power. There are n cities numbered 1 ...
- 2017北京国庆刷题Day3 morning
期望得分:100+60+0=160 实际得分:100+30+0=130 考场上用的哈希 #include<cstdio> #include<cstring> #include& ...