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


要使用数组中的元素,就需要数组的定位。定位的实现需要借助数组指针来完成。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值,而不是遍历数组本身。



相关阅读:
详解Android进程和线程
C#通过委托调用Button单击事件的方法
Win10自动安装游戏应用问题的解决方法
Android应用开发中模拟按下HOME键的效果(实现代码)
js实现的奥运倒计时时钟效果代码
JavaScript 对象字面量讲解
Java数组操作的10大方法
解决mysql5中文乱码问题的方法
C#删除文件夹和文件到回收站示例
子元素div高度不确定时父div高度如何自适应
删除条目时弹出的确认对话框
MySQL可以使用斜线来当字段的名字
Mac下如何给网页截图保存整个网页
Java中Properties的使用详解
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 美丽的北湖450字 2016社保局三送工作心得体会3篇 观《超级演说家》有感 皇帝讨论清明节 我只是想走我想走的路 月锁重帘,夜醉寒江何觅帆 八十大寿致词 美丽的交通大学 昨夜似乎下过一场雨 写给老去的80后 钟晓阳经典语录精选 四句偈——等 诗四首 懒惰者 值得品味一生的精言妙语 那碗馄饨作文500字 熏伊草的梦——(6)Open 梦幻心情 上作文800字 政法大学非法学专业法院实习报告 《小故事大智慧》读后感 秘书长就职演讲稿 当时光精确到数字 童年的老家作文800字 保姆万姐 保持一颗平常心议论文 【岭南师院】无言的付出——“希望”社会实践队“三下乡”活动之 李颀《古意》 散文:缘来如此 【雪之恋】春雪情怀 我亲爱的父母 2013年幼儿园中班年终工作总结 花开花谢花满天。作文100字 秋雨随风潜入夜(竹叶青发表了日志) 高中高二作文1000字:飘落的灿烂 那些年沙漠了沧田 无价的布衣橱 我是怎样度过人生的低潮期的 过去的爱 善与恶——读《悲惨世界》作文700字 教育随笔:关于孩子的嫉妒心理 读《三国演义》有感_600字 生命的价值在于珍惜自己作文800字 尔康痛彻心扉! 初中初一作文900字:这就是生活 你看这个行不行作文1400字 英勇的标点 虎脸瀑布一日游 给自己唱首歌 难忘的斯坦福之行 县优秀班主任事迹材料 2015反假货币专项整治的报告 抗旱减灾保增收工作汇报

Copyright © 2016 phpStudy |