浅谈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 相关文章推荐
vBulletin HACK----关于排版的两个HACK
Oct 09 PHP
PHP-MySQL教程归纳总结
Jun 07 PHP
PHP 伪静态隐藏传递参数名的四种方法
Feb 22 PHP
php长字符串定义方法
Jul 12 PHP
通过php快速统计某个数据库中每张表的数据量
Sep 04 PHP
怎样使用php与jquery设置和读取cookies
Aug 08 PHP
php 不使用js实现页面跳转
Feb 11 PHP
php中实现用数组妩媚地生成要执行的sql语句
Jul 10 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
Mar 14 PHP
PHP实现时间比较和时间差计算的方法示例
Jul 24 PHP
浅谈php使用curl模拟多线程发送请求
Mar 08 PHP
PHP goto语句用法实例
Aug 06 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 Header用于页面跳转要注意的几个问题总结
2008/10/03 PHP
php连接与操作PostgreSQL数据库的方法
2014/12/25 PHP
PHPExcel实现的读取多工作表操作示例
2020/04/14 PHP
PHP如何使用array_unshift()在数组开头插入元素
2020/09/01 PHP
javascript跨域的4种方法和原理详解
2014/04/08 Javascript
js获取当前时间显示在页面上并每秒刷新
2014/12/24 Javascript
jQuery找出网页上最高元素的方法
2015/03/20 Javascript
微信小程序 location API接口详解及实例代码
2016/10/12 Javascript
loading动画特效小结
2017/01/22 Javascript
jacascript DOM节点——元素节点、属性节点、文本节点
2017/04/18 Javascript
微信小程序选择图片和放大预览图片功能
2017/11/02 Javascript
vue中路由参数传递可能会遇到的坑
2017/12/07 Javascript
深入理解Vue nextTick 机制
2018/04/28 Javascript
Nodejs中的require函数的具体使用方法
2019/04/02 NodeJs
Vue+ElementUI项目使用webpack输出MPA的方法
2019/08/27 Javascript
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
2019/12/04 Javascript
微信小程序纯文本实现@功能
2020/04/08 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
python使用in操作符时元组和数组的区别分析
2015/05/19 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
python使用opencv读取图片的实例
2017/08/17 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
2017/12/12 Python
详解python的ORM中Pony用法
2018/02/09 Python
python抓取网页内容并进行语音播报的方法
2018/12/24 Python
python实现可变变量名方法详解
2019/07/01 Python
python如何删除文件、目录
2020/06/23 Python
PyTorch的torch.cat用法
2020/06/28 Python
pandas to_excel 添加颜色操作
2020/07/14 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
美国修容界大佬创建的个人美妆品牌:Kevyn Aucoin Beauty
2018/12/12 全球购物
学术会议邀请函范文
2014/01/22 职场文书
教师竞聘演讲稿
2014/05/16 职场文书
体育专业求职信
2014/07/16 职场文书
2014年社区妇联工作总结
2014/12/02 职场文书
餐厅服务员岗位职责
2015/02/09 职场文书
JS精髓原型链继承及构造函数继承问题纠正
2022/06/16 Javascript