浅谈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脚本的10个技巧(4)
Oct 09 PHP
PHP+XML 制作简单的留言本 图文教程
Nov 02 PHP
php 日期时间处理函数小结
Dec 18 PHP
php连接mssql的一些相关经验及注意事项
Feb 05 PHP
关于二级目录拖拽排序的实现(源码示例下载)
Apr 26 PHP
php笔记之:php数组相关函数的使用
Apr 26 PHP
浅析php原型模式
Nov 25 PHP
thinkphp四种url访问方式详解
Nov 28 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
Jun 23 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
Jun 17 PHP
phpStorm+XDebug+chrome 配置详解
Apr 01 PHP
PHP+MySQL实现在线测试答题实例
Jan 02 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预定义常量
2006/12/25 PHP
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
PHP实现对站点内容外部链接的过滤方法
2014/09/10 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
PHP使用PDO访问oracle数据库的步骤详解
2017/09/29 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
2019/10/24 PHP
JS焦点图切换,上下翻转
2011/05/12 Javascript
js操作iframe的一些方法介绍
2013/06/25 Javascript
JS防止用户多次提交的简单代码
2013/08/01 Javascript
JavaScript导出Excel实例详解
2014/11/25 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
ES6中如何使用Set和WeakSet
2016/03/10 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
2016/05/07 Javascript
JS工作中的小贴士之”闭包“与事件委托的”阻止冒泡“
2016/06/16 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
解决wx.onMenuShareTimeline出现的问题
2016/08/16 Javascript
AngularJS Ajax详解及示例代码
2016/08/17 Javascript
JavaScript异步上传图片文件的实例代码
2017/07/04 Javascript
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
2018/09/18 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
[53:29]完美世界DOTA2联赛循环赛 DM vs Matador BO2第二场 11.04
2020/11/05 DOTA
Python的Django框架中使用SQLAlchemy操作数据库的教程
2016/06/02 Python
Python中关于Sequence切片的下标问题详解
2017/06/15 Python
手把手教你使用Python创建微信机器人
2019/04/29 Python
python实现查找所有程序的安装信息
2020/02/18 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
2020/02/27 Python
Python实现鼠标自动在屏幕上随机移动功能
2020/03/14 Python
python 给图像添加透明度(alpha通道)
2020/04/09 Python
一款恶搞头像特效的制作过程 利用css3和jquery
2014/11/21 HTML / CSS
html5 input属性使用示例
2013/06/28 HTML / CSS
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
Paul Smith英国官网:英国国宝级时装品牌
2019/03/21 全球购物
迪斯尼假期(欧洲、中东及非洲):Disney Holidays EMEA
2021/02/15 全球购物
医学毕业生自我鉴定
2013/10/30 职场文书
2016年安康杯竞赛活动总结
2016/04/05 职场文书