数组有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学习笔记之数组游标操作的更多相关文章

  1. 树莓派学习笔记——使用文件IO操作GPIO SysFs方式

    0 前言     本文描写叙述假设通过文件IO sysfs方式控制树莓派 GPIO端口.通过sysfs方式控制GPIO,先訪问/sys/class/gpio文件夹,向export文件写入GPIO编号, ...

  2. PHP学习笔记之数组篇

    摘要:其实PHP中的数组和JavaScript中的数组很相似,就是一系列键值对的集合.... 转载请注明来源:PHP学习笔记之数组篇   一.如何定义数组:在PHP中创建数组主要有两种方式,下面就让我 ...

  3. Windows phone 8 学习笔记(2) 数据文件操作

    原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...

  4. JavaScript学习笔记之数组(二)

    JavaScript学习笔记之数组(二) 1.['1','2','3'].map(parseInt) 输出什么,为什么? ['1','2','3'].map(parseInt)//[1,NaN,NaN ...

  5. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  6. python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

  7. Android:日常学习笔记(10)———使用LitePal操作数据库

    Android:日常学习笔记(10)———使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式 ...

  8. Python3+Selenium3+webdriver学习笔记13(js操作应用:弹出框无效如何处理)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记13(js操作应用:弹出框无效如何处理)'''from sel ...

  9. Python3+Selenium3+webdriver学习笔记12(js操作应用:滚动条 日历 内嵌div)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记12(js操作应用:滚动条 日历 内嵌div)'''from ...

随机推荐

  1. 前端开发学习之——利用模板实现涉及url问题时的bug分析及解决(chrome源码)

    例如我们要实现如下页面,其中历史页面列表想来自底层返回的数据,此处用testData代替: 最初我写的实现代码如下: html文件: <!doctype html> <html cl ...

  2. BMP图像直方图均衡算法(C语言大作业)

    万丈高楼平地起 C语言大作业 一.学习笔记篇 1.学习MarkDown MarkDown注重写作本身,而非花俏的界面 编辑器:vscode 插件:Markdown,Markdown Preview 2 ...

  3. 【JQuery】事件

    一.前言        接着上一章选择器的知识,继续啊jQuery的学习 二.内容 $(function(){}) 文档初始化加载 event.pageX 相对于文档左边缘的鼠标位置 event.pa ...

  4. 常州day1p4

    给定一棵 n 个点的树,树上每个节点代表一个小写字母,询问一个字符串 S 是否在树上出现过? 字符串 S 出现过即表示存在两个点 u,v,u 到 v 的最短路径上依次连接所有点上的字母恰好是 S N ...

  5. 洛谷P1602 Sramoc问题 题解报告【同余+bfs】

    题目描述 话说员工们整理好了筷子之后,就准备将快餐送出了,但是一看订单,都傻眼了:订单上没有留电话号码,只写了一个sramoc(k,m)函数,这什么东西?什么意思?于是餐厅找来了资深顾问团的成员,YQ ...

  6. 【codechef】Children Trips

    Portal -->CC_Children Trips Solution (英文题解看得真爽qwq不过写的好详细啊ovo) 首先这题有一个很重要的条件就是边权是\(1\)或者\(2\),所以虽然 ...

  7. opencv透视变换GetPerspectiveTransform的总结

    对于透视变换,必须为map_matrix分配一个3x3数组,除了3x3矩阵和三个控点变为四个控点外,透视变化在其他方面与仿射变换完全类似.具体可以参考:点击打开链接 主要用到两个函数WarpPersp ...

  8. PID控制算法的C语言实现一 PID算法原理

    本系列是转载............. 全部的程序有一个共同点:就是我没认真去调pid的参数 在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握PID算法的设 ...

  9. php前后端分离项目跨域问题解决办法

    由于之前一直没有做过前后端分离项目,导致走了不少弯路,而且还采用了一种及其不优雅的方法 (在第一次请求的时候把服务器返回的session id保存起来,后续请求的时候把该session id作为参数传 ...

  10. mysql database 格式的查看和改变

    MySQL中,数据库的编码是一个相当重要的问题,有时候我们需要查看一下当前数据库的编码,甚至需要修改一下数据库编码. 查看当前数据库编码的SQL语句为: mysql> use xxx Datab ...