php array只能放一种类型的数据(浅谈PHP array_search 和 in_array 函数效率问题)
php array只能放一种类型的数据
浅谈PHP 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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
原文链接:https://learnku.com/laravel/t/34826
- 微信小程序引用模板的函数(微信小程序页面与组件之间信息传递与函数调用)
- mysql分组函数入门(详解MySQL 数据分组)
- js回调函数原理(关于JavaScript回调函数的深入理解)
- ci框架怎样修改为https协议(CI框架教程之优化验证码机制详解验证码辅助函数)
- pgsql函数里有多个事务如何处理(关于SQL数据库 msdb.dbo.sp_send_dbmail 函数发送邮件的场景分析)
- laravel终止函数执行(laravel 输出最后执行sql 附:whereIn的使用方法)
- pythonindex函数用法(python sort、sort_index方法代码实例)
- mysql的四种关系运算(详解MySQL拼接函数CONCAT的使用心得)
- sql server提供的聚合函数(SQLServer行列互转实现思路聚合函数)
- sqlserver语句创建窗口布局(SQL Server 2012 开窗函数)
- numpy常用统计分析函数(Numpy之random函数使用学习)
- php函数的使用方法(PHP中str_split函数的用法讲解)
- php生命周期表(PHP中md5函数的用法讲解)
- sql怎么查询字段合并(SQL函数将某个字段合并在一起的操作)
- php分页函数有什么用(php实现分页功能的详细实例方法)
- sql转字符串函数(sql中的常用的字符串处理函数大全)
- 被骂欺师灭祖,与郭德纲公开叫板,何云伟改名何沄伟,开始画画了(与郭德纲公开叫板)
- 相声转行影帝,被何晴抛弃,甩10年女友闪婚生子,刘威不靠谱情史(相声转行影帝被何晴抛弃)
- 岳云鹏不说相声,改行演员了 网友 快回来说相声(岳云鹏不说相声)
- 乔欣首演古装大女主,颜值演技双在线(乔欣首演古装大女主)
- 于正又推女性古装大剧 杨蓉乔欣演女配,两位女主成 重头戏(于正又推女性古装大剧)
- 乔欣古装女主戏获热度 作为女主,却没吃到红利(乔欣古装女主戏获热度)
热门推荐
- mysql什么是慢查询(MySQL慢查询的坑)
- laravel5.2模型返回数组(解决Laravel5.5下的toArray问题)
- 微信支付公众号认证(微信公众平台开发教程⑤ 微信扫码支付模式介绍)
- axios封装怎么实现(axios的简单封装以及使用实例代码)
- python如何将运行结果存入txt中(详解python读取和输出到txt)
- python中统计文本中单词数的代码(Linux上使用Python统计每天的键盘输入次数)
- vmware虚拟机与本机共享(vmware16虚拟机如何设置共享本机的文件夹)
- 阿里云服务器防御(阿里云服务器攻击超过云盾防御阀值应该怎么办?)
- python eval函数原理(浅谈Python中eval的强大与危害)
- sqlserver判断null(SQL Server索引超出了数组界限的解决方案)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9