php array in array,浅谈PHP array_search 和 in_array 函数效率问题
问题
在一个接口中,发现非常耗时,排查原因发现 array_search 查找数组中的元素的 key 时,效率随着数组变大,耗时增加。特别是大数组时,非常耗时。在函数 in_array 也有这个问题。
解决办法
采用 array_flip 翻转后,用 isset 代替 in_array 函数,用 $array[key] 替代 array_search, 这样能解决大数组超时耗时问题
下面是我从 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 函数,才有效。下面是自己做实验的结果。感谢 @木偶指出的问题
$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 array in array,浅谈PHP array_search 和 in_array 函数效率问题相关推荐
- 函数图像在图形计算机的应用,浅谈图形计算器在高中函数教学中的应用
浅谈图形计算器在高中函数教学中的应用 陈理宏广州市花都区教研室(510800) 摘要:函数是高中一个重要内容,在这个内容的学习中应用图形计算器的函数功能和绘图功能,有利于学生加深对函数知识的理解,挖掘 ...
- java同名函数_浅谈Java 继承接口同名函数问题
在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样? 动手做实验: interface A{ void fun(); } interface B{ void fun(); ...
- python hasattr函数_浅谈python中的getattr函数 hasattr函数
hasattr(object, name) 作用:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的). 示例: & ...
- python np array归一化_浅谈利用numpy对矩阵进行归一化处理的方法
浅谈利用numpy对矩阵进行归一化处理的方法 本文不讲归一化原理,只介绍实现(事实上看了代码就会懂原理),代码如下: def Normalize(data): m = np.mean(data) mx ...
- C中堆管理—浅谈malloc,free,calloc,realloc函数之间的区别
2019独角兽企业重金招聘Python工程师标准>>> 在进行C/C++编程的时候,需要程序员对内存的了解比较好清楚,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由 ...
- 浅谈构造函数与构析函数的调用顺序(转载)
构造函数 先看看构造函数的调用顺序规则,只要我们在平时编程的时候遵守这种约定,任何关于构造函数的调用问题都能解决:构造函数的调用顺序总是如下: 1.基类构造函数.如果有多个基类,则构造函数的调 ...
- 浅谈windows 编程中SendMessage函数的妙用!!!
windows编程中SendMessage函数是非常重要的,而且这个对于理解windows的消息机制也很重要.本文用代码的方式实现了一些功能,借以说明此函数之妙用.说明不当之处,希望批评指正,谢谢! ...
- 浅谈asp木马中自定义函数加密的解密
现在市面上流传了N种asp的大马.就是常说的webshell.有什么全免杀版本,什么提权加强版本.但是其中很多shell都是加密的,而且存在一些后门. 很有可能同学了忙了半天入侵了一个站,是为别人忙活 ...
- 浅谈C语言参数可变函数的实现
1.需要的头文件:stdarg.h 需要的宏:va_start(a,b) va_arg(a,b) va_end(a) 需要的类型别名: va_list 2.基本用法 (1)写函 ...
最新文章
- CentOS 7 源码编译安装 PostgreSQL 11.2
- 【随感】看老科和当当的回眸相视
- map for循环_如何用Map、Filter和Reduce替换Python For循环?
- pearson相关系数_Pearson(皮尔逊)相关系数
- 计算机窗口预览图,window_Win7系统资源管理器加上预览窗格功能的方法, 图片缩略图是否太小?PPT - phpStudy...
- Python项目:用微信自动给女朋友每天一句英语问候
- vivo X30新细节曝光:搭载潜望式超远摄支持双模5G
- Day3 01 枚举
- 2017-2018-2 20179205 《网络攻防技术与实践》第八周作业
- LINUX系统下监控DELL服务器硬盘状态
- chrome中文本框样式问题
- linux和windows php pdf转图片,扩展安装imagick和ImageMagick
- SQL 数据库 学习 016 如何附加数据库
- SQL 同比、环比计算公式及实例演示
- win7安装VisualStudio2017
- 韩寒《三重门》精彩语录2
- 数据挖掘在淘宝CRM中的应用
- 在github上写脚注的方法 markdown
- 自然码官方辅助码键位图
- 工控物联网案例-如何利用LTE-658 4G DTU实现水文水利远程物联网监控
热门文章
- Php中方法作用域,PHP 函数(下):匿名函数和作用域
- Linux ubuntu16.04 安装opencv4教程(源码编译)
- html for 循环模板
- 尝试修改LabelImg,将以对顶角画框改成以对角线相交点向四周画框
- Yolo-v2_ Windows平台下如何配置darknet-yolov2?(安装CUDA)
- java 表单请求_java模拟表单请求
- ugui unity 图片缩放循环_Unity基础系列(四)——构造分形(递归的实现细节)...
- java中实现十六进制和十进制之间的转换
- open-capacity-platform 项目启动
- java publickey_Java中RSAPublicKey在不同平台的差异性