浅谈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 相关文章推荐
加速XP搜索功能堪比vista
Mar 22 PHP
php Try Catch异常测试
Mar 01 PHP
php 分页原理详解
Aug 21 PHP
PHP漏洞全解(详细介绍)
Nov 13 PHP
解析PHP中如何将数组变量写入文件
Jun 06 PHP
zf框架的校验器InArray使用示例
Mar 13 PHP
ThinkPHP上使用多说评论插件的方法
Oct 31 PHP
php5.4以下版本json不支持不转义内容中文的解决方法
Jan 13 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
Feb 14 PHP
PHP入门教程之数学运算技巧总结
Sep 11 PHP
PHP PDOStatement::fetchAll讲解
Jan 31 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
Dec 01 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
php array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
PHP基础陷阱题(变量赋值)
2012/09/12 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
2013/07/03 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
自动最大化窗口的Javascript代码
2013/05/22 Javascript
javascript刷新父页面的各种方法汇总
2014/09/03 Javascript
css与javascript跨浏览器兼容性总结
2014/09/15 Javascript
Javascript的闭包详解
2014/12/26 Javascript
js获取checkbox值的方法
2015/01/28 Javascript
jquery代码实现简单的随机图片瀑布流效果
2015/04/20 Javascript
Jquery中使用show()与hide()方法动画显示和隐藏图片
2015/10/08 Javascript
jQuery formValidator表单验证
2016/01/07 Javascript
轻松实现JavaScript图片切换
2016/01/12 Javascript
JS iFrame加载慢怎么解决
2016/05/13 Javascript
jquery.Callbacks的实现详解
2016/11/30 Javascript
AngularJS表单验证功能
2017/10/19 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
Easyui 去除jquery-easui tab页div自带滚动条的方法
2019/05/10 jQuery
Vue强制组件重新渲染的方法讨论
2020/02/03 Javascript
天翼开放平台免费短信验证码接口使用实例
2013/12/18 Python
python在linux中输出带颜色的文字的方法
2014/06/19 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
2018/04/17 Python
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
python的命名规则知识点总结
2019/10/04 Python
python使用隐式循环快速求和的实现示例
2020/09/11 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
2021/02/22 Python
css3中新增的样式使用示例附效果图
2014/08/19 HTML / CSS
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
网上常见的一份Linux面试题(多项选择部分)
2014/09/09 面试题
护理自荐信
2013/10/22 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
高中班主任工作总结(范文)
2019/08/20 职场文书
Django实现在线无水印抖音视频下载(附源码及地址)
2021/05/06 Python
python中sqllite插入numpy数组到数据库的实现方法
2021/06/21 Python