简单了解PHP编程中数组的指针的使用


Posted in PHP onNovember 30, 2015

要使用数组中的元素,就需要数组的定位。定位的实现需要借助数组指针来完成。PHP中有很多函数可以移动数组指针。下面将给大家介绍几个。

将指针移动到下一个数组位置next()

next()函数返回紧接着放在当前数组指针下一个位置的数组值。其形式如下:

mixed next(array array)

以下是一个例子:

$fruits = array("apple", "banana", "orange", "pear");

echo next($fruits);

echo next($fruits);

// banana

// orange

还可以将指针前移,也可以直接移动到数组的开始和结尾位置。

将指针移动到前一个数组位置prev()

prev()函数返回位于当前指针前一个位置的数组值,如果指针本来就位于数组的第一个位置,则返回false。其形式如下:

mixed prev(array array)

prev()的用法与next()相同,例子就省略了。

将指针移到第一个数组位置reset()

reset()函数用于将数组指针设置回数组的开始位置。其形式如下:

mixed reset(array array)

如果需要在脚本中多次查看或处理一个数组,就经常使用这个函数,另外这个函数还经常在排序结束时使用。

将指针移动到最后一个数组位置end()

end()函数将指针移动到数组的最后一个位置,将返回最后一个元素。其形式如下:

mixed end(array array)

下面的例子展示了如果获取第一个和最后一个数组值:

$fruits = array("apple", "banana", "orange", "pear");

echo current($fruits);

echo end($fruits);

// apple

// pear

对于数组作为参数在函数间传递时又存在这样一个规律:我们知道,函数调用时,系统会将实参copy一份赋值给形参(引用调用除外),而对于数组,不仅仅 copy了实参的值,而且还copy了实参数组当前内部指针的位置。如果实参内部指针的位置指向了数组末尾,那么系统会将形参的内部指针重置,指向形参数 组的第一个单元;如果实参内部指针的位置不在数组末尾,即指向了有效的单元,那么系统会将形参的数组指针位置与实参的数组指针指向值相同的数组单元。

如果不做 $arr['var6'] = 6 这一步操作,6个变量($var1-$var6)都将有值,因为在each之后,数组指针已经指向了数组的末尾,那么在调用函数 func()时,系统会重置 $arrtmp的数组指针,将其指向第一个元素。但是在进行 $arr['var6'] = 6这步操作之后,一切就改变了,这一个操作让$arr的数组指针由原来指向一个NULL变成了一个有效值(说明一下,赋值前后,数组指针指向的地址单元一 直是没有变化的,只不过是赋值前,那个地址单元什么也没有,而赋值之后变成了6)。这就使得$arr的数组指针指向了一个有效的单元,那么在调用函数 func()时,系统是不会重置$arrtmp的数组指针的,$arrtmp的数组指针将会跟$arr的数组指针一样,指向他自己的最后一个单元。而 each函数又是从当前数组指针的位置开始工作的。因此each函数操作的第一个结果的返回值就是数组$arrtmp的最后一个元素了,它将数组指针再向下移动一位,while循环到此结束,因此$arrtmp['var1']-$arrtmp['var5']都没有被遍历到,最终导致$var1-$var6为NULL。

数组在赋值的过程中,赋值数组和被赋值数组各自数组指针的变化情况。 先给出一条结论,然后我们在用代码来证明这个结论吧。$arrtmp=$arr;在这个赋值表达式中我把$arr叫做赋值数组,把$arrtmp叫做被赋值数组。数 组在赋值时,如果赋值数组的数组指针已经指向了数组末尾,则赋值之后赋值数组的数组指针会被重置,指向数组第一个元素;如果在赋值时,赋值数组的数组指针 没有指向数组末尾,而是指向了任何一个有效的数组元素,那么在赋值之后赋值数组的数组指针是不会被重置的,而是保留其原来指向的元素。在赋值之后,被赋值 数组不仅有了赋值数组的值,而且赋值数组的数组指针指向了那个元素,被赋值的数组也会指向自己中值相同的那个元素。

demo1:

<?php
 $arr = array('var1'=>1,'var2'=>2,'var3'=>3,'var4'=>4,'var5'=>5);
 while( list($key,$value) = each($arr) )
 {
 if($value == 4) break;
 }
 var_dump(current($arr));
 
 $arr1 = $arr;
 
 var_dump(current($arr));
 var_dump(current($arr1));
?>

demo1 的执行结果是:int(5) int(5) int(5) 。从这个结果可以看出,赋值前后$arr的数组指针位置没有发生任何变化,$arr1不仅值跟$arr相同,而且数组指针所指向的元素值也是相同的。现在 用上述结论来解释这个结果,在while循环中,有一个if判断语句,目的是不让$arr的数组指针指向数组末尾,而是保留在一个有效的位置。 在$value=4时会跳出循环,而each这个函数会将数组指针向前移动一位,这就导致了$arr的数组指针指向了第5个元素,所以在赋值之 前,current($arr)的结果是5,赋值之后,由于在赋值之前$arr的当前指针并没有指向末尾,因此在赋值之后不会将$arr的数组指针进行重 置,而是保留了其原有的位置,因此在赋值之后使用current($arr)的结果仍然是5。赋值时$arr1不仅获得了$arr的值,而且数组指针指向 的元素和$arr的相同,二者都是5。

<?php
$arr = array('var1'=>1,'var2'=>2,'var3'=>3,'var4'=>4,'var5'=>5);
while( list($key,$value) = each($arr) )
{
  //if($value == 4) break;
}
var_dump(current($arr));
$arr1 = $arr;
var_dump(current($arr));
var_dump(current($arr1));
?>

demo2中我们将 if($value == 4) break; 这一句注释掉了,目的很简单,就是通过each将$arr的数组指针位置指向数组末尾。

demo2 的执行结果:bool(false) int(1) bool(false) 。如果数组指针对应的元素为0,"",或者不是一个有效的值时,current函数会返回false,$arr的值中没有为0或者""的情况,因此可以断 定是因为数组指针指向了一个无效的元素而导致current返回了一个false。换句话说就是可以确定在while循环完成之后,$arr的数组指针已 经指向了数组的末尾。所以我们看到在赋值之前current($arr)的值是false,而赋值之后current($arr)的值变成了1,说明赋值 之后$arr的数组指针被重置了,指向了数组的第一个元素。current($arr1)的值为false,说明赋值之后$arr1让然保留了赋值之 前$arr的数组指针指向的元素。

通过demo1和demo2就可以证明上述结论了。

因此为了在遍历数组时不受数组指针的影响,最好在使用each()函数之前或者之后调用函数reset()将数组指针重置。这样就可以避免上述问题的发生了。另外还有一个操作数组指针的函数prev(),它的作用是将数组指针当前的位置后退一位,它也需要注意一点,就是如果数组指针已经指向数组末尾,那么使它就得不到想要的结果了。

顺便说一下foreach这个函数,使用foreach函数来遍历数组时,它会重置数组指针,将其指向数组的第一个元素。必须注意的是foreach操作的对象是对你要遍历的数组的copy值,而不是遍历数组本身。

PHP 相关文章推荐
全新的PDO数据库操作类php版(仅适用Mysql)
Jul 22 PHP
PHP 线程安全与非线程安全版本的区别深入解析
Aug 06 PHP
PHP mkdir()无写权限的问题解决方法
Jun 19 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
Jul 02 PHP
PHP队列用法实例
Nov 05 PHP
php使用function_exists判断函数可用的方法
Nov 19 PHP
PHP中的switch语句的用法实例详解
Oct 21 PHP
php中的常用魔术方法汇总
Feb 14 PHP
PHP getallheaders无法获取自定义头(headers)的问题
Mar 23 PHP
PHP MySql增删改查的简单实例
Jun 21 PHP
thinkPHP模板中函数的使用方法示例
Nov 30 PHP
php实现文件管理与基础功能操作
Mar 21 PHP
PHP 微信支付类 demo
Nov 30 #PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
Nov 30 #PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
Nov 30 #PHP
PHP curl模拟登录带验证码的网站
Nov 30 #PHP
PHP可变函数学习小结
Nov 29 #PHP
PHP可变变量学习小结
Nov 29 #PHP
PHP中对数组的一些常用的增、删、插操作函数总结
Nov 27 #PHP
You might like
PHP面向对象概念
2011/11/06 PHP
php字符串分割函数explode的实例代码
2013/02/07 PHP
解析将多维数组转换为支持curl提交的一维数组格式
2013/07/08 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
Linux下PHP连接Oracle数据库
2014/08/20 PHP
学习php设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
认识延迟时间为0的setTimeout
2008/05/16 Javascript
Javascript入门学习资料收集整理篇
2008/07/06 Javascript
javascript中数组array及string的方法总结
2014/11/28 Javascript
javascript正则表达式之search()用法实例
2015/01/19 Javascript
JS实现点击按钮后框架内载入不同网页的方法
2015/05/05 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
图片上传之FileAPI与NodeJs
2017/01/24 NodeJs
利用canvas实现的加载动画效果实例代码
2017/07/05 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
2017/08/03 Javascript
JS实现页面内跳转的简单代码
2017/09/03 Javascript
jQuery选择器之子元素过滤选择器
2017/09/28 jQuery
Vue.js实现的计算器功能完整示例
2018/07/11 Javascript
详解React 的几种条件渲染以及选择
2018/10/23 Javascript
JavaScript栈和队列相关操作与实现方法详解
2018/12/07 Javascript
iphone刘海屏页面适配方法
2019/05/07 Javascript
Vue中this.$nextTick的作用及用法
2020/02/04 Javascript
在Python下尝试多线程编程
2015/04/28 Python
python3抓取中文网页的方法
2015/07/28 Python
使用pyecharts无法import Bar的解决方案
2020/04/23 Python
python之matplotlib学习绘制动态更新图实例代码
2018/01/23 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
2020/04/25 Python
Python如何实现大型数组运算(使用NumPy)
2020/07/24 Python
理工大学毕业生自荐信范文
2014/02/22 职场文书
房屋转让协议书范本
2014/04/11 职场文书
超市工作总结范文2014
2014/12/19 职场文书
2016清明节森林防火广播稿
2015/12/17 职场文书
JavaScript中MutationObServer监听DOM元素详情
2021/11/27 Javascript
Android 中的类文件和类加载器详情
2022/06/05 Java/Android