PHP编程入门之PHP数组指针
作者:bea
在以前的文章中我写过一篇PHP学习:遍历数组的几种方法。下面这篇文章是LAMP兄弟连的一篇好文章,转过来了。这篇文章讲到了PHP数组指针,有些PHPer可能认为PHP中不像C语言那样有指针,其实在PHP中指针是无处不在的,只是PHP已经帮我们实现了。
现在我们再来谈论一下数组在赋值的过程中,赋值数组和被赋值数组各自数组指针的变化情况。
先给出一条结论,然后我们在用代码来证明这个结论吧。$arrtmp=$arr;在这个赋值表达式中我把$arr叫做赋值数组,把$arrtmp叫做被赋值数组。数组在赋值时,如果赋值数组的数组指针已经指向了数组末尾,则赋值之后赋值数组的数组指针会被重置,指向数组第一个元素;如果在赋值时,赋值数组的数组指针没有指向数组末尾,而是指向了任何一个有效的数组元素,那么在赋值之后赋值数组的数组指针是不会被重置的,而是保留其原来指向的元素。在赋值之后,被赋值数组不仅有了赋值数组的值,而且赋值数组的数组指针指向了那个元素,被赋值的数组也会指向自己中值相同的那个元素。
demo1:
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。
demo2:
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值,而不是遍历数组本身。
上述对数组指针的理解仅是一家之言,还望各位在留下脚印的同时,不要忘记批评指正。
有用 | 无用猜你喜欢
您可能感兴趣的文章:
- memcache的工作原理解析
- 阅读一套PHP开源软件的方法和步骤
- vim设置默认字体、窗口大小和配色方案
- PHP快速入门之PHP视频教程推荐
- PHP编程入门之制作一个表单提交
- 基于PHP编写的blog博客推荐
- PHP blog wordpress使用感受
- PHP blog wordpress简单介绍
- AJAX中文乱码解决方法
- wordpress插件wp-pagenavi使用和安装
- wordpress添加新页面没有模板选项
- wordpress在IIS环境下实现伪静态
- Apache环境设置默认打开页面方法
- PHP实现中文字符串切取无乱码
- 给PHP编程入门新手的一些建议
- 详解PHP的echo print print_r输出
- 使用PHP批量删除复选框checkbox
- PHP编程入门之for循环遍历数组
- 分享一个获取服务器配置信息PHP类