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 相关文章推荐
用PHP连接Oracle数据库
Oct 09 PHP
php基础知识:类与对象(1)
Dec 13 PHP
模拟flock实现文件锁定
Feb 14 PHP
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
Mar 19 PHP
探讨PHP中this,self,parent的区别详解
Jun 08 PHP
yii框架通过控制台命令创建定时任务示例
Apr 30 PHP
在PHP中使用X-SendFile头让文件下载更快
Jun 01 PHP
php switch语句多个值匹配同一代码块应用示例
Jul 29 PHP
PHP使用pear实现mail发送功能 windows环境下配置pear
Apr 15 PHP
phpcms中的评论样式修改方法
Oct 21 PHP
PHP实现防止表单重复提交功能【基于token验证】
May 24 PHP
PHP如何通过表单直接提交大文件详解
Jan 08 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
Wordpress 相册插件 NextGEN-Gallery 添加目录将中文转为拼音的解决办法
2010/12/29 PHP
php学习笔记(三)操作符与控制结构
2011/08/06 PHP
PHP ignore_user_abort函数详细介绍和使用实例
2014/07/15 PHP
PHP清除数组中所有字符串两端空格的方法
2014/10/20 PHP
PHP利用二叉堆实现TopK-算法的方法详解
2017/04/24 PHP
php7 新增功能实例总结
2020/05/25 PHP
javascript实现的像java、c#之类的sleep暂停的函数代码
2010/03/04 Javascript
纯js写的分页表格数据为json串
2014/02/18 Javascript
javascript数组操作总结和属性、方法介绍
2014/04/05 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
2015/08/27 Javascript
详解JavaScript基于面向对象之继承实例
2015/12/16 Javascript
JS实现关闭当前页而不弹出提示框的方法
2016/06/22 Javascript
AngularJS $injector 依赖注入详解
2016/09/14 Javascript
基于Bootstrap的网页设计实例
2017/03/01 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
javascript 中的try catch应用总结
2017/04/01 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
为vue项目自动设置请求状态的配置方法
2019/06/09 Javascript
layer.open组件获取弹出层页面变量、函数的实例
2019/09/25 Javascript
Angular 多模块项目构建过程
2020/02/13 Javascript
js根据后缀判断文件文件类型的代码
2020/05/09 Javascript
vue 在单页面应用里使用二级套嵌路由
2020/12/19 Vue.js
详解python的数字类型变量与其方法
2016/11/20 Python
tensorflow入门之训练简单的神经网络方法
2018/02/26 Python
Django框架模板文件使用及模板文件加载顺序分析
2019/05/23 Python
python如何爬取动态网站
2020/09/09 Python
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
2016/05/17 HTML / CSS
时尚、社区、科技:SEVENSTORE
2019/04/26 全球购物
CK巴西官方网站:Calvin Klein巴西
2019/07/19 全球购物
yy司仪主持词
2014/03/22 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
学生旷课检讨书500字
2014/10/28 职场文书
小学教师年度个人总结
2015/02/05 职场文书
2016优秀大学生个人事迹材料范文
2016/03/01 职场文书
公司会议开幕词
2016/03/03 职场文书
导游词之大雁塔景区
2019/09/17 职场文书