浅谈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与paypal整合方法
Nov 28 PHP
PHP中usort在值相同时改变原始位置问题的解决方法
Nov 27 PHP
基于PHP+Ajax实现表单验证的详解
Jun 25 PHP
ThinkPHP中ajax使用实例教程
Aug 22 PHP
php实现webservice实例
Nov 06 PHP
PHP根据session与cookie用户登录状态操作类的代码
May 13 PHP
php自动载入类用法实例分析
Jun 24 PHP
thinkphp分页实现效果
Oct 13 PHP
php 实现Hash表功能实例详解
Nov 29 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
Jun 09 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
Nov 16 PHP
php判断目录存在的简单方法
Sep 26 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 面向对象实现代码
2009/11/11 PHP
供参考的 php 学习提高路线分享
2011/10/23 PHP
thinkPHP实现表单自动验证
2014/12/24 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
JQuery里选择超链接的实现代码
2011/05/22 Javascript
删除javascript所创建子节点的方法
2015/05/21 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
2015/11/04 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
JavaScript中字符串与Unicode编码互相转换的实现方法
2015/12/18 Javascript
深入学习jQuery Validate表单验证
2016/01/18 Javascript
Node.js操作Firebird数据库教程
2016/03/04 Javascript
JS实现table表格数据排序功能(可支持动态数据+分页效果)
2016/05/26 Javascript
JS简单实现tab切换效果的多窗口显示功能
2016/09/07 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
jquery easyui DataGrid简单示例
2017/01/23 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
vue之浏览器存储方法封装实例
2018/03/15 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
2018/08/19 Javascript
json前后端数据交互相关代码
2018/09/19 Javascript
Vue CLI 2.x搭建vue(目录最全分析)
2019/02/27 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
[01:34]2014DOTA2 TI预选赛预选赛 选手比赛房大揭秘!
2014/05/20 DOTA
[01:35]2018年度CS GO最佳战队-完美盛典
2018/12/17 DOTA
Python编程中实现迭代器的一些技巧小结
2016/06/21 Python
Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)
2017/06/27 Python
Python实现快速傅里叶变换的方法(FFT)
2018/07/21 Python
Tensorflow分类器项目自定义数据读入的实现
2019/02/05 Python
Django 内置权限扩展案例详解
2019/03/04 Python
Django 导出项目依赖库到 requirements.txt过程解析
2019/08/23 Python
2013年大学生的自我鉴定
2013/10/24 职场文书
市场部规章制度
2014/01/24 职场文书
公安个人四风问题对照检查及整改措施
2014/10/28 职场文书
婚礼上证婚人致辞
2015/07/28 职场文书
课文《燕子》教学反思
2016/02/17 职场文书
2016年优秀共产党员先进事迹材料
2016/02/29 职场文书