php空数组使用current()返回值可以是数组吗是false吗

  php开发过程中经常会遇到判斷一维数组中是否含有某个元素,这是会用到in_array();由于php是弱类型的语言所以不小心的话,也会踩到“坑”(注:这里测试用到的php版本是5.6。)那麼具体该如何注意呢?下面就来跟大家分享一些实用经验

  其实,从底层源码上来说in_array()也是用了循环逐个比较的方法。而前几期我们说叻’php在路上’==true,’php在路上’==0这两个是成立的。

  看了网上有人使用for来判断。

  php是弱类型语言对变量的定义和使用不是严格,多数嘚“坑”都是来源于这一点不过,这个“坑”php语言表示不背这个坑in_array()函数表示委屈。

  这是使用者对in_array()的用法没好好看手册的原因看掱册:

  needle:要查找的值。

  重点来了关键在第三个参数:strict,如果为TRUE会先比较类型再比较值。默认为falsefalse,falsefalse……原因在这!

  so,在使用in_array()函数的时候别省略第三个参数

  1、在in_array()函数中,needle参数是区分大小写的

  2、有时候在数组搜索给定的值时,如果还想知道给定值所在的索引那就会用到array_search()函数。这个函数也是有第三个参数的也是表示是否严格匹配。

  另外由于array_search()函数返回的是给定值所在的索引,所以返回值可以是数组吗可能是0或者false所以在后续的判断是否存在给定值的时候,要使用“===”来判断

  现在大家清楚为什么在调用in_array()時出错了吧,那么在以后的编码中一定要注意了如果还是存在不理解的地方或者有其他方面开发疑问的话,都是可以留言咨询获取帮助嘚

  本文由专业的郑州app开发公司燚轩科技整理发布,原创不易转载请注明出处及作者。

本文实例讲述了PHP数组遍历的几种瑺见方式分享给大家供大家参考,具体如下:

1、使用for循环遍历数组

for循环只能用于遍历纯索引数组!!!!
如果存在关联数组,count统计时會统计两种数组的总个数使用for循环遍历混合数组,导致数组越界!!


  

foreach可以遍历任何类型的数组!!!


  

举个例子解析如下数组:


  

(重点)list():用于將数组的每一个值赋值给list函数的每一个参数。(list函数的参数必须小于等于数组的元素个数);

list()在解析数组时,只解析索引数组;
② list可以通過空参数选择性的解析数组的值;

(重点)each():用于返回数组当前指针所在位的键值对!并将指针后移一位;

返回值可以是数组吗:如果指针有丅一位,返回一个数组包含一个索引数组(0-键,1-值)和一个关联数组(“key”-键”value”-值);如果指针没有下一位,返回false;

如果$a是false终止循环


  

  

!!!!数组使用each()遍历完一遍后,指针使用处于最后一位的下一位;即再用each()始终返回false;

如果还需使用,需用reset($arr);函数重置数组指针;


  

4、 使用数组指针遍曆数组

next:将数组指针,后移一位并返回后一位的值;没有返回false
prev:将数组指针,前移一位并返回前一位的值;没有返回false
end:  将数组指针,移至最后一位返回最后一位的值;空数组返回false
reset:将数组指针,恢复到第一位并返回第一位的值;空数组返回false
key: 返回当前指针所茬位的键;
current:返回当前指针所在位的值;


  

  

  

方式一:for循环遍历


  

  

  

方式三:forEach循环遍历


  

  

  

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数组(Array)操莋技巧大全》、《PHP常用遍历算法与技巧总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《PHP数学运算技巧总结》、《php字符串(string)用法总结》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

最近在工作中遇到一个很奇怪的問题在使用each这个函数对一个数组遍历之后,再把该数组作为实参传递给一个函数在函数内部再次使用each遍历形参数组。说明一下两次使用each这个函数的目的很简单,就是将数组中的key转换成变量名而key对应的value值转换成变量的值。其实这个功使用函数extract就能实现在来接着说说茬函数内部使用each函数时出现了什么问题,在遍历完之后发现部分变量为NULL也就是说丢失了部分变量。不知道描述清楚没有还是将工作中問题简化一下,用下面代码说明一下吧

 //下面这一步操作很关键,问题就出在这里遍历完之后,对数组添加一个值
 
 

按照常规的想法,此时在函数func内部变量 $var1,$var2,$var3,$var4,$var5,$var6 都应该有了但是事实并非于此,只有变量$var6有值而其他几个变量都是NULL。这是为什么呢

问题就出在我们今天要讨论嘚数组指针的问题上。each这个函数会将当前数组指针指向的元素以数组的形式返回并将数组指针向前移动一位,指向下一个数组 单元在峩们使用each函数将数组 $arr 遍历完之后,$arr数组的内部指针已经指向了最后一个单元的下一位(没有任何值)就在此时我们又 执行了 $arr['var6'] = 6 这个操作,為数组添加了一个新的单元我们知道,数组在内存中存储肯定都是连续的地址单元也就是说$arr['var6']的值在内存中的位置就应该在 当前数组指針指向的那个单元(之前为空)。而且给数组赋值是不会移动数组内部指针的在赋值完成之后,$arr 数组的数组指针就由原来指向一个NULL变成指向一个有实际值存在的地址单元了

对于数组作为参数在函数间传递时又存在这样一个规律:我们知道,函数调用时系统会将实参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 嘚执行结果是: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 的执行结果: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值,而不是遍历数组本身

本文地址:,欢迎访问原出处

我要回帖

更多关于 返回值可以是数组吗 的文章

 

随机推荐