浅谈PHP array_search 和 in_array 函数效率问题


Posted in PHP onOctober 15, 2019

问题

在一个接口中,发现非常耗时,排查原因发现 array_search 查找数组中的元素的 key 时,效率随着数组变大,耗时增加。特别是大数组时,非常耗时。在函数 in_array 也有这个问题。

解决办法

采用 array_flip 翻转后,用 isset 代替 in_array 函数,用 $array[key] 替代 array_search, 这样能解决大数组超时耗时问题

下面是我从 php 官网抄下来的笔记,可以观察这两个方法效率的差异

原网址:https://www.php.net/manual/en/function.in-array.php

If you're working with very large 2 dimensional arrays (eg 20,000+ elements) it's much faster to do this...

$needle = 'test for this';

$flipped_haystack = array_flip($haystack);

if ( isset($flipped_haystack[$needle]) )
{
 print "Yes it's there!";
}

I had a script that went from 30+ seconds down to 2 seconds (when hunting through a 50,000 element array 50,000 times).

Remember to only flip it once at the beginning of your code though!

--------------------2019-10-14 更新 ----------------------

更正

有人提出意见说道,array_flip 效率比 in_array 和 array_search 高,做了一些实验,确实如此。这点是我原来没有考虑到问题。这个解决办法,适用于多次使用 in_array 和 array_search 函数,才有效。下面是自己做实验的结果。感谢 @木偶指出的问题

<?php
$array = array();

for ($i=0; $i<200000; $i++){
  ##随机字符串
  $array[$i] = get_rand().$i;
}

$str = $array[150000];
$time1 = microtime(true);
array_search($str, $array);
$time2 = microtime(true);
echo '原始方法:'.($time2-$time1)."\n";

$time3 = microtime(true);
$new_array = array_flip($array);
isset($new_array[$str]);
$time4 = microtime(true);
echo '新方法:'.($time4-$time3);

结果:

原始方法:0.0010008811950684
新方法:0.0069980621337891

循环 5000 次

$array = array();

for ($i=0; $i<200000; $i++){
  ##随机字符串
  $array[$i] = get_rand().$i;
}

$str = $array[199999];
$time1 = microtime(true);
for ($i=0; $i<5000; $i++){
  array_search($str, $array);
}
$time2 = microtime(true);

echo '原始方法:'.($time2-$time1)."\n";

$time3 = microtime(true);
$new_array = array_flip($array);
for ($i=0; $i<5000; $i++){
  isset($new_array[$str]);
}
$time4 = microtime(true);

echo '新方法:'.($time4-$time3);

结果:

原始方法:2.9000020027161
新方法:0.008030891418457

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
oracle资料库函式库
Oct 09 PHP
php !function_exists(&quot;T7FC56270E7A70FA81A5935B72EACBE29&quot;))代码解密
Jan 07 PHP
php XPath对XML文件查找及修改实现代码
Jul 27 PHP
PHP CURL模拟登录新浪微博抓取页面内容 基于EaglePHP框架开发
Jan 16 PHP
PHP中判断变量为空的几种方法小结
Nov 12 PHP
PHP实现自动登入google play下载app report的方法
Sep 23 PHP
php操作MongoDB类实例
Jun 17 PHP
Yii支持多域名cors原理的实现
Dec 05 PHP
php使用array_chunk函数将一个数组分割成多个数组
Dec 05 PHP
解决Laravel5.2 Auth认证退出失效的问题
Oct 14 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
Feb 11 PHP
PHP SESSION跨页面传递失败解决方案
Dec 11 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
Oct 15 #PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
Oct 15 #PHP
Laravel 不同生产环境服务器的判断实践
Oct 15 #PHP
laravel自定义分页的实现案例offset()和limit()
Oct 15 #PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
Oct 15 #PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
Oct 15 #PHP
Laravel实现搜索的时候分页并携带参数
Oct 15 #PHP
You might like
PHP stream_context_create()函数的使用示例
2015/05/12 PHP
PHP 中常量的知识整理
2017/04/14 PHP
Jquery动态改变图片IMG的src地址示例
2013/06/25 Javascript
NodeJS的url截取模块url-extract的使用实例
2013/11/18 NodeJs
javascript中Function类型详解
2015/04/28 Javascript
javascript实现设置、获取和删除Cookie的方法
2015/06/01 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
2016/08/23 Javascript
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
2016/10/09 Javascript
基于hover的用法实例(推荐)
2017/07/04 Javascript
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
vue如何获取点击事件源的方法
2017/08/10 Javascript
select自定义小三角样式代码(实用总结)
2017/08/18 Javascript
jquery ajaxfileupload异步上传插件
2017/11/21 jQuery
微信小程序使用scroll-view标签实现自动滑动到底部功能的实例代码
2018/11/09 Javascript
详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
2018/11/12 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
2019/09/09 Javascript
JavaScript复制变量三种方法实例详解
2020/01/09 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
[02:00]DAC2018主宣传片——龙征四海,剑问东方
2018/03/20 DOTA
黑科技 Python脚本帮你找出微信上删除你好友的人
2016/01/07 Python
Python数据结构之翻转链表
2017/02/25 Python
python通过opencv实现批量剪切图片
2017/11/13 Python
15行Python代码实现网易云热门歌单实例教程
2019/03/10 Python
python使用flask与js进行前后台交互的例子
2019/07/19 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
2019/08/12 Python
python 实现多维数组(array)排序
2020/02/28 Python
Python学习工具jupyter notebook安装及用法解析
2020/10/23 Python
详解Pycharm第三方库的安装及使用方法
2020/12/29 Python
Monnier Frères美国官网:法国知名奢侈品网站
2016/11/22 全球购物
职业生涯规划怎么写
2013/12/29 职场文书
学雷锋活动倡议书
2014/08/30 职场文书
购房委托书范本
2014/09/18 职场文书
教师党的群众路线对照检查材料
2014/09/24 职场文书
创先争优宣传标语
2014/10/08 职场文书
用React Native制作一个简单的游戏引擎
2021/05/27 Javascript