浅谈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 相关文章推荐
使用php显示搜索引擎来的关键词
Feb 13 PHP
php格式化日期和时间格式化示例分享
Feb 24 PHP
php中获取主机名、协议及IP地址的方法
Nov 18 PHP
windows中为php安装mongodb与memcache
Jan 06 PHP
PHP获取数组最后一个值的2种方法
Jan 21 PHP
php+xml结合Ajax实现点赞功能完整实例
Jan 30 PHP
PHP递归调用数组值并用其执行指定函数的方法
Apr 01 PHP
PHP中仿制 ecshop验证码实例
Jan 06 PHP
详解PHP中mb_strpos的使用
Feb 04 PHP
php微信开发之关键词回复功能
Jun 13 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
Apr 30 PHP
php日志函数error_log用法实例分析
Sep 23 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 静态变量与自定义常量的使用方法
2010/01/26 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
2014/05/04 PHP
php 函数使用可变数量的参数方法
2017/05/02 PHP
详解PHP文件的自动加载(autoloading)
2018/02/04 PHP
php删除二维数组中的重复值方法
2018/03/12 PHP
jQuery中setTimeout的几种使用方法小结
2013/04/07 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
判断访客终端类型集锦
2015/06/05 Javascript
谈谈因Vue.js引发关于getter和setter的思考
2016/12/02 Javascript
JavaScript实现公历转农历功能示例
2017/02/13 Javascript
js replace()去除代码中空格的实例
2017/02/14 Javascript
tab栏切换原理
2017/03/22 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
vuejs 单文件组件.vue 文件的使用
2017/07/28 Javascript
Nuxt.js实战详解
2018/01/18 Javascript
axios发送post请求,提交图片类型表单数据方法
2018/03/16 Javascript
clipboard.js在移动端复制失败的解决方法
2018/06/13 Javascript
微信小程序开发背景图显示功能
2018/08/08 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
2018/08/31 Javascript
Vue 实现把表单form数据 转化成json格式的数据
2019/10/29 Javascript
vue表单验证之禁止input输入框输入空格
2020/12/03 Vue.js
JavaScript使用setTimeout实现倒计时效果
2021/02/19 Javascript
《Python学习手册》学习总结
2018/01/17 Python
python爬虫面试宝典(常见问题)
2018/03/02 Python
python使用KNN算法识别手写数字
2019/04/25 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
2020/03/09 Python
css3的图形3d翻转效果应用示例
2014/04/08 HTML / CSS
Tirendo比利时:在线购买轮胎
2018/10/22 全球购物
Lookfantastic意大利官网:英国知名美妆购物网站
2019/05/31 全球购物
班级聚会策划书
2014/01/16 职场文书
销售员岗位职责
2014/06/09 职场文书
2014年加油站站长工作总结
2014/12/23 职场文书
青年文明号汇报材料
2014/12/23 职场文书
辞职信怎么写
2015/02/27 职场文书
教师节联欢会主持词
2015/07/04 职场文书
《别在吃苦的年纪选择安逸》读后感3篇
2019/11/30 职场文书