浅谈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 相关文章推荐
模拟OICQ的实现思路和核心程序(三)
Oct 09 PHP
PHP脚本的10个技巧(2)
Oct 09 PHP
php方法调用模式与函数调用模式简例
Sep 20 PHP
PHP输出时间差函数代码
Jan 28 PHP
使用PHP破解防盗链图片的一个简单方法
Jun 07 PHP
分享PHP守护进程类
Dec 30 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
Mar 07 PHP
PHP微信公众号自动发送红包API
Jun 01 PHP
Docker 如何布置PHP开发环境
Jun 21 PHP
PHP实现防盗链的方法分析
Jul 25 PHP
PHP观察者模式定义与用法实例分析
Mar 22 PHP
PHP+Redis开发的书签案例实战详解
Jul 09 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 数字左侧自动补0
2008/03/31 PHP
php模板函数 正则实现代码
2012/10/15 PHP
php中Array2xml类实现数组转化成XML实例
2014/12/08 PHP
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同的解决办法
2013/05/13 Javascript
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
jQuery中复合属性选择器用法实例
2014/12/31 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
2015/12/25 Javascript
ES6的新特性概览
2016/03/10 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
详解jQuery插件开发方式
2016/11/22 Javascript
原生js实现日期计算器功能
2017/02/17 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
jquery实现异步加载图片(懒加载图片一种方式)
2017/04/24 jQuery
微信小程序实现多宫格抽奖活动
2020/04/15 Javascript
Vue侧滑菜单组件——DrawerLayout
2017/12/18 Javascript
微信小程序之圆形进度条实现思路
2018/02/22 Javascript
Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
2018/04/28 Javascript
使用vuex缓存数据并优化自己的vuex-cache
2018/05/30 Javascript
[03:40]DOTA2英雄梦之声_第01期_炼金术士
2014/06/23 DOTA
Python中用sleep()方法操作时间的教程
2015/05/22 Python
python制作小说爬虫实录
2017/08/14 Python
python3 发送任意文件邮件的实例
2018/01/23 Python
python中format()函数的简单使用教程
2018/03/14 Python
Flask框架请求钩子与request请求对象用法实例分析
2019/11/07 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
2020/04/21 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
一个入门级python爬虫教程详解
2021/01/27 Python
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
办公室人员先进事迹
2014/01/27 职场文书
大学军训感言800字
2014/02/27 职场文书
《绿色蝈蝈》教学反思
2014/03/02 职场文书
优秀毕业生就业推荐信
2014/05/22 职场文书
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
公安局负责人查摆问题及整改方案
2014/09/27 职场文书
违纪检讨书范文
2015/01/27 职场文书