php数组函数array_key_exists()小结


Posted in PHP onDecember 10, 2015

array_key_exists()函数判断某个数组中是否存在指定的key,如果key存在,则返回true,否则返回flase

array_key_exists(key,array);

key:必需。规定键名
array:必需。规定输入的数组

<?php
$a = array('a'=>'Dog','b'=>'Cat');
if(array_key_exists('a',$a)){
  echo 'Key exists!';
} else{
  echo 'Key does not exist!';
}
?>

输出:Key exists!

array_key_exists为什么比in_array快?

array_key_exists 和 in_array 查询的东西都不一样吧
array_key_exists 判断是否有键值
array_key_exists(a,arr)->if(isset(arr[a]))就是true

而in_array 需要去遍历值 遍历到了才跳出循环

追问:
是不是数组的索引有单独的存储单元,而且优化过,array_key_exists的时间复杂度是o(1), 而in_array是o(n) ??

追答:
重复杂度来说是这样

array_key_exists  是判断某个键有没有值

in_array  要遍历一次 获取是否相同 不知道建的情况下必须遍历

PHP中isset与array_key_exists的区别

1.对于数组值的判断不同,对于值为null或''或false,isset返回false,array_key_exists返回true;

2. 执行效率不同,isset是内建运算符,array_key_exists是php内置函数,isset要快一些。请参考:PHP 函数实现原理及性能分析

3.当用isset访问一个不存在索引数组值时,不会引起一个E_NOTICE的php错误消息;

4.array_key_exists 会调用get_defined_vars判断数组变量是否存在,isset不用;

测试代码:

<?php
function
microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$test_arr['aa']='dd';
$test_arr['bb']='';
$test_arr['cc']=NULL;
$test_arr['dd']=false;
$test_arr= array('aa'=>'dd','bb'=>'','cc'=>null,'dd'=>false);
echo "isset aa is ";var_dump(isset($test_arr['aa']));echo "n";
echo "isset bb is ";var_dump(isset($test_arr['bb']));echo "n";
echo "isset cc is ";var_dump(isset($test_arr['cc']));echo "n";
echo "isset dd is ";var_dump(isset($test_arr['cc']));echo "n";
echo "isset none is ";var_dump(isset($test_arr['none']));echo "n";
echo "key_exist aa is ";var_dump(array_key_exists('aa',$test_arr));echo "n";
echo "key_exist bb is ";var_dump(array_key_exists('bb',$test_arr));echo "n";
echo "key_exist cc is ";var_dump(array_key_exists('cc',$test_arr));echo "n";
echo "key_exist dd is ";var_dump(array_key_exists('dd',$test_arr));echo "n";
echo "key_exist none is ";var_dump(array_key_exists('none',$test_arr));echo "n";
$time_start = microtime_float();
for($i=0;$i<100;$i++){
isset($test_arr['aa']);
}
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "isset 100 is $timen";
for($i=0;$i<10000;$i++){
isset($test_arr['aa']);
}
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "isset 10000 is $timen";
for($i=0;$i<1000000;$i++){
isset($test_arr['aa']);
}
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "isset 1000000 is $timen";
//++++++++++++++++++++++++++++++
$time_start = microtime_float();
for($i=0;$i<100;$i++){
array_key_exists('aa',$test_arr);
}
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "array_key_exists 100 is $timen";
for($i=0;$i<10000;$i++){
array_key_exists('aa',$test_arr);
}
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "array_key_exists 10000 is $timen";
for($i=0;$i<1000000;$i++){
array_key_exists('aa',$test_arr);
}
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "array_key_exists 1000000 is $timen";
PHP 相关文章推荐
Classes and Objects in PHP5-面向对象编程 [1]
Oct 09 PHP
PHP 开发环境配置(测试开发环境)
Apr 28 PHP
php对数组排序的简单实例
Dec 25 PHP
PHP APC配置文件2套和参数详解
Jun 11 PHP
php实现使用正则将文本中的网址转换成链接标签
Dec 03 PHP
php格式化时间戳
Dec 17 PHP
PHP迭代器接口Iterator用法分析
Dec 28 PHP
php删除一个路径下的所有文件夹和文件的方法
Feb 07 PHP
PHP PDOStatement::errorCode讲解
Jan 31 PHP
Laravel 创建指定表 migrate的例子
Oct 09 PHP
laravel5.6实现数值转换
Oct 23 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
Jun 06 PHP
php封装的连接Mysql类及用法分析
Dec 10 #PHP
PHP多维数组遍历方法(2种实现方法)
Dec 10 #PHP
thinkPHP使用post方式查询时分页失效的解决方法
Dec 09 #PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
Dec 09 #PHP
微信支付PHP SDK之微信公众号支付代码详解
Dec 09 #PHP
作为程序员必知的16个最佳PHP库
Dec 09 #PHP
学习php设计模式 php实现备忘录模式(Memento)
Dec 09 #PHP
You might like
利用PHP动态生成VRML网页
2006/10/09 PHP
纯PHP生成的一个树叶图片画图例子
2014/04/16 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
javascript 跳转代码集合
2009/12/03 Javascript
jquery京东商城双11焦点图多图广告特效代码分享
2015/09/06 Javascript
Javascript页面跳转常见实现方式汇总
2015/11/28 Javascript
JavaScript表单验证实例之验证表单项是否为空
2016/01/10 Javascript
Node.js Sequelize如何实现数据库的读写分离
2016/10/23 Javascript
原生js实现放大镜效果
2017/01/11 Javascript
AngularJS路由Ui-router模块用法示例
2017/05/29 Javascript
微信小程序实现笑脸评分功能
2018/11/03 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
vue+moment实现倒计时效果
2019/08/26 Javascript
在elementui中Notification组件添加点击事件实例
2020/11/11 Javascript
学习python处理python编码问题
2011/03/13 Python
Python使用openpyxl读写excel文件的方法
2017/06/30 Python
Python编写一个闹钟功能
2017/07/11 Python
Django框架搭建的简易图书信息网站案例
2019/05/25 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
2020/06/17 Python
荷兰网上鞋店:Ziengs.nl
2017/01/02 全球购物
稀有和绝版书籍:Biblio.com
2017/02/02 全球购物
澳洲网红粉泥面膜:Sand & Sky
2019/08/13 全球购物
护理工作感言
2014/01/16 职场文书
《我为你骄傲》教学反思
2014/02/20 职场文书
《蝙蝠和雷达》教学反思
2014/04/23 职场文书
五一口号
2014/06/19 职场文书
实习生工作证明范本
2014/09/14 职场文书
2015会计试用期工作总结
2014/12/12 职场文书
学生逃课检讨书
2015/02/17 职场文书
2015年街道除四害工作总结
2015/05/15 职场文书
《认识年月日》教学反思
2016/02/19 职场文书
嵌入式Redis服务器在Spring Boot测试中的使用教程
2021/07/21 Redis
纯html+css实现奥运五环的示例代码
2021/08/02 HTML / CSS
Redis命令处理过程源码解析
2022/02/12 Redis