php 查找数组元素提高效率的方法详解


Posted in PHP onMay 05, 2017

1.php in_array方法说明

PHP查找数组元素是否存在,一般会使用in_array方法。

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

参数说明:

needle

待搜索的值,如果needle是字符串,比较是区分大小写的。

haystack

用来比较的数组

strict

如果第三个参数 strict 的值为 TRUE 则 in_array() 函数还会检查 needle 的类型是否和 haystack 中的相同

返回值

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

2.in_array查找元素效率

当比较的数组haystack较大时,in_array效率会很低

例子:使用in_array对有10万个元素的数组进行1000次比较

<?php
$arr = array();

// 创建10万个元素的数组
for($i=0; $i<100000; $i++){
 $arr[] = $i;
}

// 记录开始时间
$starttime = getMicrotime();

// 随机创建1000个数字使用in_array比较
for($j=0; $j<1000; $j++){
 $str = mt_rand(1,99999);
 in_array($str, $arr);
}

// 记录结束时间
$endtime = getMicrotime();

echo 'run time:'.(float)(($endtime-$starttime)*1000).'ms<br>';
/**
 * 获取microtime
 * @return float
 */
function getMicrotime(){
 list($usec, $sec) = explode(' ', microtime());
 return (float)$usec + (float)$sec;
}
?>

run time:2003.6449432373ms

使用in_array判断元素是否存在,在10万个元素的数组中比较1000次,运行时间需要约2秒

3.提高查找元素效率方法

我们可以先使用array_flip进行键值互换,然后使用isset方法来判断元素是否存在,这样可以提高效率。

例子:使用array_flip先进行键值互换,再使用isset方法判断,在10万个元素的数组中比较1000次

<?php
$arr = array();

// 创建10万个元素的数组
for($i=0; $i<100000; $i++){
 $arr[] = $i;
}

// 键值互换
$arr = array_flip($arr);

// 记录开始时间
$starttime = getMicrotime();

// 随机创建1000个数字使用isset比较
for($j=0; $j<1000; $j++){
 $str = mt_rand(1,99999);
 isset($arr[$str]);
}

// 记录结束时间
$endtime = getMicrotime();

echo 'run time:'.(float)(($endtime-$starttime)*1000).'ms<br>';
/**
 * 获取microtime
 * @return float
 */
function getMicrotime(){
 list($usec, $sec) = explode(' ', microtime());
 return (float)$usec + (float)$sec;
}
?>

run time:1.2781620025635ms

使用array_flipisset判断元素是否存在,在10万个元素的数组中比较1000次,运行时间需要约1.2毫秒

因此,对于大数组进行比较,使用array_flipisset方法会比in_array效率高很多。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

PHP 相关文章推荐
提取HTML标签
Oct 09 PHP
PHP初学者常见问题集合 修正版(21问答)
Mar 23 PHP
PHP+jquery实时显示网站在线人数的方法
Jan 04 PHP
PHP中创建和验证哈希的简单方法实探
Jul 06 PHP
PHP Web木马扫描器代码分享
Sep 06 PHP
PHP弹出对话框技巧详细解读
Sep 26 PHP
PHP从二维数组得到N层分类树的实现代码
Oct 11 PHP
PHP实现一个多功能购物网站的案例
Sep 13 PHP
PHP网页安全认证的实例详解
Sep 28 PHP
PHP多进程之pcntl_fork的实例详解
Oct 15 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
php实现微信发红包功能
Jul 13 PHP
thinkPHP分页功能实例详解
May 05 #PHP
php cli模式下获取参数的方法
May 05 #PHP
ajax调用返回php接口返回json数据的方法(必看篇)
May 05 #PHP
ThinkPHP 3.2.2实现事务操作的方法
May 05 #PHP
PHP实现Session入库/存入redis的方法
May 04 #PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
May 04 #PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
May 04 #PHP
You might like
php中数据的批量导入(csv文件)
2006/10/09 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
2016/02/15 PHP
php 5.4 全新的代码复用Trait详解
2017/01/05 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
2017/11/07 PHP
Laravel 6.2 中添加了可调用容器对象的方法
2019/10/22 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
图像替换新技术 状态域方法
2010/01/28 Javascript
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
jQuery中live()方法用法实例
2015/01/19 Javascript
js实现搜索框关键字智能匹配代码
2020/03/26 Javascript
jQuery实现获取元素索引值index的方法
2016/09/18 Javascript
vue-router 权限控制的示例代码
2017/09/21 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
基于vue中的scoped坑点解说
2020/09/04 Javascript
Javascript实现打鼓效果
2021/01/29 Javascript
实例讲解Python编程中@property装饰器的用法
2016/06/20 Python
PHP统计代码行数的小代码
2019/09/19 Python
Html5移动端div固定到底部实现底部导航条的几种方式
2021/03/09 HTML / CSS
台湾森森购物网:U-mall
2017/10/16 全球购物
高档奢华时装在线目的地:FORWARD by elyse walker
2017/10/16 全球购物
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
介绍一下你对SOA的认识
2016/04/24 面试题
模具设计与制造专业应届生求职信
2013/10/18 职场文书
应届医学毕业生求职信分享
2013/12/02 职场文书
单位消防安全制度
2014/01/12 职场文书
二手书店创业计划书
2014/01/16 职场文书
意向书范文
2014/03/31 职场文书
国贸专业毕业求职信
2014/06/11 职场文书
党干部专题民主生活会对照检查材料思想汇报
2014/10/06 职场文书
坎儿井导游词
2015/02/09 职场文书
2015年后备干部工作总结
2015/05/15 职场文书
2015年高中班级工作总结
2015/07/21 职场文书
2016国培学习心得体会
2016/01/08 职场文书
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
2021/05/25 Python
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby