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下判断数组中是否存在相同的值array_unique
Mar 25 PHP
一个PHP分页类的代码
May 18 PHP
PHP防止跨域提交表单
Nov 01 PHP
PHP解决URL中文GBK乱码问题的两种方法
Jun 03 PHP
php使用ob_start()实现图片存入变量的方法
Nov 14 PHP
PHP里8个鲜为人知的安全函数分析
Dec 09 PHP
PHP语法小结之基础和变量
Nov 22 PHP
PHP设置头信息及取得返回头信息的方法
Jan 25 PHP
PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
Oct 11 PHP
ThinkPHP实现分页功能
Apr 28 PHP
php基于session锁防止阻塞请求的方法分析
Aug 07 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 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
使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
2014/05/05 PHP
PHP中new static() 和 new self() 的区别介绍
2015/01/09 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
php自定义类fsocket模拟post或get请求的方法
2015/07/31 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
2019/06/17 PHP
php swoft框架实例用法
2020/12/22 PHP
非常有用的40款jQuery 插件推荐(系列二)
2011/12/25 Javascript
使用jquery实现以post打开新窗口
2014/03/19 Javascript
jQuery中hover方法和toggle方法使用指南
2015/02/27 Javascript
javascript实现PC网页里的拖拽效果
2016/03/14 Javascript
Angular外部使用js调用Angular控制器中的函数方法或变量用法示例
2016/08/05 Javascript
JavaScript中对象的不同创建方法
2016/08/12 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
2016/09/05 Javascript
jquery 动态增加,减少input表单的简单方法(必看)
2016/10/12 Javascript
JS将unicode码转中文方法
2017/05/08 Javascript
JS监听事件的叠加和移除功能
2018/11/19 Javascript
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
2019/06/04 Javascript
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
vue proxy 的优势与使用场景实现
2020/06/15 Javascript
DataFrame中去除指定列为空的行方法
2018/04/08 Python
Django 连接sql server数据库的方法
2018/06/30 Python
python实现字符串中字符分类及个数统计
2018/09/28 Python
Python对象的属性访问过程详解
2020/03/05 Python
django rest framework serializers序列化实例
2020/05/13 Python
Python numpy矩阵处理运算工具用法汇总
2020/07/13 Python
Python 使用office365邮箱的示例
2020/10/29 Python
商得四方公司面试题(gid+)
2014/04/30 面试题
大学生职业生涯规划书
2014/03/14 职场文书
求职教师自荐书
2014/06/19 职场文书
面试复试通知单
2015/04/24 职场文书
任长霞观后感
2015/06/16 职场文书
解除处分决定书
2015/06/25 职场文书
新闻通讯稿模板
2015/07/22 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP
python playwright 自动等待和断言详解
2021/11/27 Python