浅谈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 相关文章推荐
第六节 访问属性和方法 [6]
Oct 09 PHP
教你如何把一篇文章按要求分段
Oct 09 PHP
php下批量挂马和批量清马代码
Feb 27 PHP
Array of country list in PHP with Zend Framework
Oct 17 PHP
PHP删除非空目录的函数代码小结
Feb 28 PHP
深入apache配置文件httpd.conf的部分参数说明
Jun 28 PHP
php数组添加元素方法小结
Dec 20 PHP
如何用PHP来实现一个动态Web服务器
Jul 29 PHP
使用Codeigniter重写insert的方法(推荐)
Mar 23 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 PHP
PHP+jQuery实现即点即改功能示例
Feb 21 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 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分页函数
2006/07/08 PHP
php str_replace替换指定次数的方法详解
2017/05/05 PHP
jquery animate 动画效果使用说明
2009/11/04 Javascript
jQuery ajax cache缓存问题
2010/07/01 Javascript
zeroclipboard复制到剪切板的flash
2010/08/04 Javascript
TextArea不支持maxlength的解决办法(jquery)
2011/09/13 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
js特殊字符转义介绍
2013/11/05 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
Javascript中的delete操作符详细介绍
2014/06/06 Javascript
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
完美实现js选项卡切换效果(二)
2017/03/08 Javascript
node中使用es5/6以及支持性与性能对比
2017/08/11 Javascript
微信小程序在地图选择地址并返回经纬度简单示例
2018/12/03 Javascript
vue-router传参用法详解
2019/01/19 Javascript
Promise扫盲贴
2019/06/24 Javascript
解决vue-cli 打包后自定义动画未执行的问题
2019/11/12 Javascript
原生js实现贪吃蛇游戏
2020/10/26 Javascript
Python交换变量
2008/09/06 Python
Python随机生成彩票号码的方法
2015/03/05 Python
python3实现读取chrome浏览器cookie
2016/06/19 Python
Python中运算符&quot;==&quot;和&quot;is&quot;的详解
2016/10/08 Python
详解python脚本自动生成需要文件实例代码
2017/02/04 Python
Python实现京东秒杀功能代码
2019/05/16 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
2019/10/11 Python
python实现KNN分类算法
2019/10/16 Python
python实现飞机大战小游戏
2019/11/08 Python
flask框架url与重定向操作实例详解
2020/01/25 Python
Python 面向对象之类class和对象基本用法示例
2020/02/02 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
moosejaw旗下的户外商品促销网站:Mountain Steals
2017/02/27 全球购物
五年级学生评语
2014/04/22 职场文书
培训科主任岗位职责
2014/08/08 职场文书
openstack中的rpc远程调用的方法
2021/07/09 Python