浅谈PHP array_search 和 in_array 函数效率问题


Posted in PHP onOctober 15, 2019

问题

在一个接口中,发现非常耗时,排查原因发现 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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
Get或Post提交值的非法数据处理
Oct 09 PHP
使用adodb lite解决问题
Dec 31 PHP
php中通过curl smtp发送邮件
Jun 05 PHP
php学习笔记之面向对象编程
Dec 29 PHP
深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复
Aug 05 PHP
ThinkPHP3.1新特性之G方法的使用
Jun 19 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
Nov 29 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
Dec 19 PHP
Laravel模板引擎Blade中section的一些标签的区别介绍
Feb 10 PHP
Laravel5.1自定义500错误页面示例
Oct 09 PHP
PHP SFTP实现上传下载功能
Jul 26 PHP
PHP与以太坊交互详解
Aug 24 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
Oct 15 #PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
Oct 15 #PHP
Laravel 不同生产环境服务器的判断实践
Oct 15 #PHP
laravel自定义分页的实现案例offset()和limit()
Oct 15 #PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
Oct 15 #PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
Oct 15 #PHP
Laravel实现搜索的时候分页并携带参数
Oct 15 #PHP
You might like
《星际争霸II》全新指挥官斯台特曼现已上线
2020/03/08 星际争霸
一棵php的类树(支持无限分类)
2006/10/09 PHP
用定制的PHP应用程序来获取Web服务器的状态信息
2006/10/09 PHP
php读取javascript设置的cookies的代码
2010/04/12 PHP
PHP删除特定数组内容并且重建数组索引的方法.
2011/03/25 PHP
php实现用于计算执行时间的类实例
2015/04/18 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
2019/04/16 PHP
使用TextRange获取输入框中光标的位
2006/10/14 Javascript
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
js中文逗号转英文实现
2014/02/11 Javascript
jQuery动态修改字体大小的方法【测试可用】
2016/09/09 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
2017/01/04 Javascript
微信小程序 支付后台java实现实例
2017/05/09 Javascript
详解React服务端渲染从入门到精通
2019/03/28 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
2019/09/27 Javascript
前端深入理解Typescript泛型概念
2020/03/09 Javascript
原生js实现html手机端城市列表索引选择城市
2020/06/24 Javascript
python多线程编程方式分析示例详解
2013/12/06 Python
Python实现多线程抓取妹子图
2015/08/08 Python
Python 列表理解及使用方法
2017/10/27 Python
python字典操作实例详解
2017/11/16 Python
Martinelli官方商店:西班牙皮鞋和高跟鞋品牌
2019/07/30 全球购物
儿科主治医生个人求职信
2013/09/23 职场文书
中专生求职自荐信范文
2013/12/22 职场文书
乡镇总工会学雷锋活动总结
2014/03/01 职场文书
规范化管理年活动总结
2014/08/29 职场文书
缅怀先烈演讲稿
2014/09/03 职场文书
党员干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
西部计划志愿者工作总结
2015/08/11 职场文书
女人创业励志语录,句句蕴含能量,激发你的潜能
2019/08/20 职场文书
Redis基于Bitmap实现用户签到功能
2021/06/20 Redis
解析redis hash应用场景和常用命令
2021/08/04 Redis
python神经网络Xception模型
2022/05/06 Python