array_search和in_array函数效率怎样,如何优化
Admin 2022-06-29 群英技术资讯 1360 次浏览
很多朋友都对“array_search和in_array函数效率怎样,如何优化”的内容比较感兴趣,对此小编整理了相关的知识分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获,那么感兴趣的朋友就继续往下看吧!问题
在一个接口中,发现非常耗时,排查原因发现 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
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
我们知道在laravel中,无法使用$_SESSION,那么就只能用框架的session。不少新手朋友都有遇到laravel框架session失效的问题,那么要怎么样解决呢?下面我们一起来看看解决办法。
laravel中,orm全称“Object-Relational Mapping”,意思为“对象关系映射”,它的作用是在关系型数据库和业务实体对象之间作一个映射;这样在操作业务对象时,不需和复杂的SQL语句打交道,只需操作对象的属性和方法。
在做开发时,我们可能会遇到需要上传多张图片的需求,那么我具体要如何来实现呢?下面小编就给大家分享一下如何使用TP5框架实现上传多张图片的方法,感兴趣的朋友可以看一看。
这篇文章给大家分享的是如何利用tp5实现自定义分页样式的内容。小编觉得挺实用的,因此分享给大家做个参考,下面是具体代码,感兴趣的朋友就继续往下看吧。
PHP支持一个错误控制运算符:@。当将其放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都被忽略掉。如果用 set_error_handler() 设定了自定义的错误处理函...
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008