浅谈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读取和编写XML DOM的实现代码
Feb 03 PHP
php curl常见错误:SSL错误、bool(false)
Dec 28 PHP
解析将多维数组转换为支持curl提交的一维数组格式
Jul 08 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
Nov 29 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
Mar 03 PHP
浅析php如何实现App常用的秒发功能
Aug 03 PHP
PHP文件系统管理(实例讲解)
Sep 19 PHP
PHP多线程模拟实现秒杀抢单
Feb 07 PHP
PHP等比例压缩图片的实例代码
Jul 26 PHP
Laravel多域名下字段验证的方法
Apr 04 PHP
PHP使用ajax的post方式下载excel文件简单示例
Aug 06 PHP
PHP接入支付宝接口失效流程详解
Nov 10 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
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
2010/05/04 PHP
php在项目中寻找代码的坏味道(综艺命名)
2012/07/19 PHP
PHP队列用法实例
2014/11/05 PHP
PHP的Yii框架的基本使用示例
2015/08/21 PHP
jQuery对表单元素的取值和赋值操作代码
2011/05/19 Javascript
推荐17个优美新鲜的jQuery的工具提示插件
2012/09/14 Javascript
求数组最大最小值方法适用于任何数组
2013/08/16 Javascript
JavaScript实现随机替换图片的方法
2015/04/16 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
2016/02/26 Javascript
JS实现动态表格的添加,修改,删除功能(推荐)
2016/06/15 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
基于jQuery实现弹幕APP
2017/02/10 Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
2017/11/22 Javascript
详解koa2学习中使用 async 、await、promise解决异步的问题
2018/11/13 Javascript
Javascript实现动态时钟效果
2018/11/17 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
2019/04/24 Javascript
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
JavaScript实现文件下载并重命名代码实例
2019/12/12 Javascript
vue项目,代码提交至码云,iconfont的用法说明
2020/07/30 Javascript
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
搞笑的程序猿:看看你是哪种Python程序员
2015/06/12 Python
一步步教你用Python实现2048小游戏
2017/01/19 Python
python for和else语句趣谈
2019/07/02 Python
python3.6中@property装饰器的使用方法示例
2019/08/17 Python
关于Tensorflow使用CPU报错的解决方式
2020/02/05 Python
Python hashlib模块的使用示例
2020/10/09 Python
用C语言实现文件读写操作
2013/10/27 面试题
五年级科学教学反思
2014/02/05 职场文书
更夫岗位责任制
2014/02/11 职场文书
幼儿园父亲节活动方案
2014/03/11 职场文书
揭牌仪式主持词
2014/03/19 职场文书
职工擅自离岗检讨书
2014/09/23 职场文书
离职报告格式
2014/11/04 职场文书
2016春节家属慰问信
2015/03/25 职场文书
家庭聚会祝酒词
2015/08/11 职场文书
幼儿园园长新年寄语
2015/08/17 职场文书