问题

在一个接口中,发现非常耗时,排查原因发现 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 函数效率问题相关推荐

  1. 函数图像在图形计算机的应用,浅谈图形计算器在高中函数教学中的应用

    浅谈图形计算器在高中函数教学中的应用 陈理宏广州市花都区教研室(510800) 摘要:函数是高中一个重要内容,在这个内容的学习中应用图形计算器的函数功能和绘图功能,有利于学生加深对函数知识的理解,挖掘 ...

  2. java同名函数_浅谈Java 继承接口同名函数问题

    在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样? 动手做实验: interface A{ void fun(); } interface B{ void fun(); ...

  3. python hasattr函数_浅谈python中的getattr函数 hasattr函数

    hasattr(object, name) 作用:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的). 示例: & ...

  4. python np array归一化_浅谈利用numpy对矩阵进行归一化处理的方法

    浅谈利用numpy对矩阵进行归一化处理的方法 本文不讲归一化原理,只介绍实现(事实上看了代码就会懂原理),代码如下: def Normalize(data): m = np.mean(data) mx ...

  5. C中堆管理—浅谈malloc,free,calloc,realloc函数之间的区别

    2019独角兽企业重金招聘Python工程师标准>>> 在进行C/C++编程的时候,需要程序员对内存的了解比较好清楚,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由 ...

  6. 浅谈构造函数与构析函数的调用顺序(转载)

    构造函数     先看看构造函数的调用顺序规则,只要我们在平时编程的时候遵守这种约定,任何关于构造函数的调用问题都能解决:构造函数的调用顺序总是如下: 1.基类构造函数.如果有多个基类,则构造函数的调 ...

  7. 浅谈windows 编程中SendMessage函数的妙用!!!

    windows编程中SendMessage函数是非常重要的,而且这个对于理解windows的消息机制也很重要.本文用代码的方式实现了一些功能,借以说明此函数之妙用.说明不当之处,希望批评指正,谢谢! ...

  8. 浅谈asp木马中自定义函数加密的解密

    现在市面上流传了N种asp的大马.就是常说的webshell.有什么全免杀版本,什么提权加强版本.但是其中很多shell都是加密的,而且存在一些后门. 很有可能同学了忙了半天入侵了一个站,是为别人忙活 ...

  9. 浅谈C语言参数可变函数的实现

    1.需要的头文件:stdarg.h   需要的宏:va_start(a,b)    va_arg(a,b)    va_end(a)   需要的类型别名: va_list 2.基本用法   (1)写函 ...

最新文章

  1. CentOS 7 源码编译安装 PostgreSQL 11.2
  2. 【随感】看老科和当当的回眸相视
  3. map for循环_如何用Map、Filter和Reduce替换Python For循环?
  4. pearson相关系数_Pearson(皮尔逊)相关系数
  5. 计算机窗口预览图,window_Win7系统资源管理器加上预览窗格功能的方法,  图片缩略图是否太小?PPT - phpStudy...
  6. Python项目:用微信自动给女朋友每天一句英语问候
  7. vivo X30新细节曝光:搭载潜望式超远摄支持双模5G
  8. Day3 01 枚举
  9. 2017-2018-2 20179205 《网络攻防技术与实践》第八周作业
  10. LINUX系统下监控DELL服务器硬盘状态
  11. chrome中文本框样式问题
  12. linux和windows php pdf转图片,扩展安装imagick和ImageMagick
  13. SQL 数据库 学习 016 如何附加数据库
  14. SQL 同比、环比计算公式及实例演示
  15. win7安装VisualStudio2017
  16. 韩寒《三重门》精彩语录2
  17. 数据挖掘在淘宝CRM中的应用
  18. 在github上写脚注的方法 markdown
  19. 自然码官方辅助码键位图
  20. 工控物联网案例-如何利用LTE-658 4G DTU实现水文水利远程物联网监控

热门文章

  1. Php中方法作用域,PHP 函数(下):匿名函数和作用域
  2. Linux ubuntu16.04 安装opencv4教程(源码编译)
  3. html for 循环模板
  4. 尝试修改LabelImg,将以对顶角画框改成以对角线相交点向四周画框
  5. Yolo-v2_ Windows平台下如何配置darknet-yolov2?(安装CUDA)
  6. java 表单请求_java模拟表单请求
  7. ugui unity 图片缩放循环_Unity基础系列(四)——构造分形(递归的实现细节)...
  8. java中实现十六进制和十进制之间的转换
  9. open-capacity-platform 项目启动
  10. java publickey_Java中RSAPublicKey在不同平台的差异性