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
- php语法基础知识(PHP中16个高危函数整理)
- sqlserver提供的内置函数(Sqlserver 自定义函数 Function使用介绍)
- sqlserver表值函数用法(SQL Server数据库中的表名称、字段比较)
- sqlserver连接字符串函数(SQL SERVER 2012新增函数之字符串函数FORMAT详解)
- 用php递归函数实现阶乘的计算(php求斐波那契数的两种实现方式递归与递推)
- sqlserver字符串截取填充(SQL Server实现split函数分割字符串功能及用法示例)
- sqlserver常见函数(SQL Server之JSON 函数详解)
- mysql日期与时间函数(MySQL日期函数与时间函数汇总MySQL 5.X)
- mysql优化使用方法(详解Mysql函数调用优化)
- php中数组使用技巧(php常用经典函数集锦数组、字符串、栈、队列、排序等)
- sql数值函数大全(sql中mod函数取余数的用法)
- JS匿名函数的用法
- php分页函数有什么用(php实现分页功能的详细实例方法)
- sql function函数的用法(SQl Function 创建函数实例介绍)
- mysql日期用法(MySQL DATE_ADD和ADDDATE函数实现向日期添加指定时间间隔)
- python迭代函数(详解Python中的内建函数,可迭代对象,迭代器)
- 以家人之名广受好评,剧情生动引起观众共鸣,演员张新成圈粉无数(以家人之名广受好评)
- 三兄妹感情再遇波折,人设接连崩塌 《以家人之名》剧情猜不透(三兄妹感情再遇波折)
- 《小敏家》金波想要复婚 这只是他圈套的第1步,更可恶的在后面(小敏家金波想要复婚)
- 小敏家 剧情离谱一锅乱炖,但他们俩绝对是这部剧的一大 亮点(剧情离谱一锅乱炖)
- 《倚天屠龙记》再遭翻拍,关晓彤主演赵敏,蒋劲夫演张无忌,你怎么看(倚天屠龙记再遭翻拍)
- 吴启华与曾舜晞两代张无忌同框,戏里经典的他却没活出原著的潇洒(吴启华与曾舜晞两代张无忌同框)
热门推荐
- dedecms标签怎么调用(Dedecms自定义表单“数据校验不对,程序返回错误”的解决方法)
- python查找含特定字符的字符串(Python实现查找字符串数组最长公共前缀示例)
- python怎么安装queue(python队列Queue的详解)
- 推荐算法第三方python(GitHub 热门:Python 算法大全,Star 超过 2 万)
- sql server中实现split功能
- python操作json库(Python将json文件写入ES数据库的方法)
- sql server 获取时间(SQL SERVER中常用日期函数的具体使用)
- python中输入背景颜色的代码(Python 给屏幕打印信息加上颜色的实现方法)
- webpack常用的配置(webpack-dev-server搭建本地服务器的实现)
- 12步轻松搞定python装饰器(Python3.5装饰器典型案例分析)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9