浅谈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获取网卡地址的代码
Apr 09 PHP
PHP中date()日期函数有关参数整理
Jul 19 PHP
PHP编码转换函数 自动转换字符集支持数组转换
Dec 16 PHP
初识PHP
Sep 28 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
Nov 19 PHP
PHP6新特性分析
Mar 03 PHP
PHP预定义变量9大超全局数组用法详解
Apr 23 PHP
php封装的mysqli类完整实例
Oct 18 PHP
php格式化时间戳
Dec 17 PHP
PHP实现执行外部程序的方法详解
Aug 17 PHP
Laravel如何使用Redis共享Session
Feb 23 PHP
浅谈laravel框架sql中groupBy之后排序的问题
Oct 17 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+mysql写的简单留言本实例代码
2008/07/25 PHP
php 带逗号千位符数字的处理方法
2012/01/10 PHP
CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录
2015/03/25 PHP
php表单提交实例讲解
2015/11/12 PHP
Yii2中datetime类的使用
2016/12/17 PHP
深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
2007/04/12 Javascript
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
(function($){...})(jQuery)的意思
2010/07/22 Javascript
Javascript变量函数浅析
2011/09/02 Javascript
Prototype的Class.create函数解析
2011/09/22 Javascript
Jquery对数组的操作技巧整理
2014/03/25 Javascript
jscript读写二进制文件的方法
2015/04/22 Javascript
JavaScript中string对象
2015/06/12 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
JavaScript基础知识及常用方法总结
2016/01/10 Javascript
JS中检测数据类型的几种方式及优缺点小结
2016/12/12 Javascript
Node.js readline 逐行读取、写入文件内容的示例
2018/03/01 Javascript
浅谈Vue数据响应
2018/11/05 Javascript
js实现点击生成随机div
2020/01/16 Javascript
Python笔记(叁)继续学习
2012/10/24 Python
使用python list 查找所有匹配元素的位置实例
2019/06/11 Python
Python正则表达式如何匹配中文
2020/05/27 Python
英国女鞋购物网站:Moda in Pelle
2019/02/18 全球购物
Bose美国官网:购买Bose耳机和音箱
2019/03/10 全球购物
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
2015/10/13 面试题
物流管理应届生求职信
2013/11/07 职场文书
幼儿园教师演讲稿
2014/05/06 职场文书
货物运输服务质量承诺书
2014/05/29 职场文书
商务经理岗位职责
2014/07/30 职场文书
车间质检员岗位职责
2015/04/08 职场文书
陈斌强事迹观后感
2015/06/17 职场文书
新年祝酒词大全
2015/08/11 职场文书
八年级作文之感恩
2019/11/22 职场文书
实现一个简单得数据响应系统
2021/11/11 Javascript
Apache自带的ab压力测试工具的实现
2022/07/23 Servers