php编程中如何避免调用in_array()函数出错问题

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

  一、前方有坑

  直接上代码:

  $arr = [‘php在路上‘,1];

  echo in_array(true,$arr) ? 1 : 0;

  echo in_array(0,$arr) ? 1 : 0;

  结果:

  11

  二、为啥有坑

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

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

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

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

  函数:

  bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

  参数:

  needle:要查找的值。

  haystack:查找的数组

  strict:是否严格匹配,TRUE 或者 FALSE

  返回值

  如果找到 needle 则返回 TRUE,否则返回 FALSE。

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

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

  三、防坑扩展

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

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

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

  如:

  $arr = [‘12‘,13,‘php在路上‘];

  echo array_search(‘12‘,$arr,true)===false ? ‘没找到‘ : ‘找到了‘;

  四、防坑互动

  看代码:

  $arr = [‘php在路上‘,12,‘‘,[‘我是字符串‘]];

  echo in_array([0],$arr) ? 1 : 0;

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

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

原文地址:http://blog.51cto.com/13686158/2170163

时间: 2024-11-06 10:09:01

php编程中如何避免调用in_array()函数出错问题的相关文章

网络编程中的read,write函数

关于TCP/IP协议,建议参考Richard Stevens的<TCP/IP Illustrated,vol1>(TCP/IP详解卷1). 关于第二层面,依然建议Richard Stevens的<Unix network proggramming,vol1>(Unix网络编程卷1),这两本书公认是Unix网络编程的圣经. 至于第三个层面,UNP的书中有所提及,也有著名的C10K问题,业界也有各种各样的框架和解决方案,本人才疏学浅,在这里就不一一敷述. 本文的重点在于第二个层面,主要

Cocos2d-x编程中CCRemoveSelf与CCCallFunc系列函数不能一起使用

可能是"头晕"了,我在编码中随意写出了如下代码:     CCLabelTTF* lbl=CCLabelTTF::create("Hi, you have succeeded in buying this Power-up!", "Arial", 32);     lbl->setColor(ccc3(255,0,0));     lbl->setPosition(VisibleRect::center());     ul2->

C#函数式编程中的递归调用之尾递归详解

关于递归相信大家已经熟悉的不能再熟悉了,所以笔者在这里就不多费口舌,不懂的读者们可以在博客园中找到很多与之相关的博客.下面我们直接切入正题,开始介绍尾递归. 尾递归 普通递归和尾递归如果仅仅只是从代码的角度出发来看,我们可能发现不了他的特点,所以笔者利用两张堆栈上的图来展示具体的差距在哪,首先我们来看看普通的递归调用的情况,如下图1.1所示: 假设这里执行的函数是Func1,并且Func1中通过递归调用了自己,那么我们可以看到栈上在每次调用Func1的时候都会重新将函数返回地址等其他参数放入栈中

JS中,子类调用超类函数

概述 JS虽然并不直接具备面向对象的特性,但仍可以通过prototype来模拟面向对象的继承和多态等特性.和大多数面向对象语言(例如C++,Java等)相比,JS来实现面向对象仍稍显繁琐和抽象,需要对JS的prototype模型有深入的理解. 在开发过程中,有时候会遇到这样一个问题:如果在子类中"覆盖"了超类的某个方法,但仍需要在子类方法中调用一次超类方法,这时候应该怎么做?如果是Java,一个简单的super关键字即可解决问题,但如果是JS呢? 解决问题的最基本方法可以是:在子类中,

如何在sqlite3连接中创建并调用自定义函数

#!/user/bin/env python # @Time :2018/6/8 14:44 # @Author :PGIDYSQ #@File :CreateFunTest.py '''如何在sqlite3连接中创建并调用自定义函数''' import sqlite3,hashlib #自定义函数 def md5sum(t): return hashlib.md5(t).hexdigest() #在内存中创建临时数据库 conn = sqlite3.connect(":memory:"

[Php.ini]PHP调用mysql_connect()函数出错:Call to undefined function mysql_connect()

初学先用appserv或xampp集成安装包,这样可以不必为单独安装apahce/mysql/php而烦恼了. 最近我在自己搭建环境时,老是出现mysql扩展装不上.已经在php.ini里打开了extension=php_mysql.dll的扩展了.后来发现核心点是在WINDOWS系统下,需要的PHP目录下的:libmysql.dll和php5ts.dll 拷贝至:windows目录下的system32下! Fatal error: Call to undefined function mysq

Erlang网络编程中的一个特别的函数prim_inet:async_accept/2(转)

为了研究怎么用Erlang写一个游戏服务器,我很幸运的下到了一份英雄远征的服务器Erlang源码,这两天花了点时间看代码,其中看到做TCP的accept动作时,它是用的一个函数prim_inet:async_accept/2,这个可跟书上说的不一样(一般来说书上教的是用gen_tcp:accept/1),于是我google了一下,发现找不到文档,再翻一下发现已经有不少人问为什么这是一个undocumented的函数,也就是说Erlang就没想让你去用这个函数,所以文档自然没提供.一般来说undo

VC++编程中常用的字符串转换函数

VC++编程中经常遇到不同编码编码的字符串之间需要转换的情况,以下简单提供几个不同编码字符串之间的转换函数: ANSI 字符串和Unicode字符串之间的转换 //Convert wide char string to ANSI string BOOL WCharToMByte(LPCWSTR lpcwszStr,Std::string &str) { DWORD dwMinSize=0; LPSTR lpszStr=NULL; dwMinSize= WideCharToMultiByte(CP

C++中构造函数能调用虚函数吗?(答案是语法可以,输出错误),但Java里居然可以

环境:XPSP3 VS2005 今天黑总给应聘者出了一个在C++的构造函数中调用虚函数的问题,具体的题目要比标题复杂,大体情况可以看如下的代码: [cpp] view plain copy class Base { public: Base() { Fuction(); } virtual void Fuction() { cout << "Base::Fuction" << endl; } }; class A : public Base { public: