假设我们正在运营一个手机相关的网站,用户可以通过指定若干参数(如操作系统,屏幕分辨率,摄像头像素等等)来筛选自己想要的手机。不过由于手机的参数多,且不同的手机其参数差异大,所以参数表结构通常是纵表(一个参数是一行),而不是横表(一个参数是一列),此时使用若干参数来取结果,通常就是把每个单独参数来取结果,再一起取交集。

假定每个参数会包含一千个左右的产品ID(int),以此为前提来模拟生成一些数据:

$rand = function() {

$result = array();

for ($i = 0; $i < 1000; $i++) {

$result[] = mt_rand(1, 10000);

}

return $result;

};

$param_a = $rand();

$param_b = $rand();

?>

注意:如果测试数据集过小的话,结论可能会出现不一致。

先看看通过PHP内置方法array_intersect实现的性能:

$time = microtime(true);

$result = array_intersect($param_a, $param_b);

$time = microtime(true) - $time;

echo "array_intersect: {$time}\n";

?>

在优化之前,我们先来看看array_intersect一些特殊的地方:

$param_a = array(1, 2, 2);

$param_b = array(1, 2, 3);

var_dump(

array_intersect($param_a, $param_b),

array_intersect($param_b, $param_a)

);

?>

array_intersect($param_a, $param_b): 1, 2, 2

array_intersect($param_b, $param_a): 1, 2

也就是说,如果在第一个数组参数中有重复元素的话,则array_intersect会返回所有满足条件的重复元素。改写array_intersect的时候最好兼容这些功能。

下面看看通过自定义方法int_array_intersect实现的性能:

function int_array_intersect()

{

if (func_num_args() < 2) {

trigger_error('param error', E_USER_ERROR);

}

$args = func_get_args();

foreach ($args AS $arg) {

if (!is_array($arg)) {

trigger_error('param error', E_USER_ERROR);

}

}

$intersect = function($a, $b) {

$result = array();

$length_a = count($a);

$length_b = count($b);

for ($i = 0, $j = 0; $i < $length_a && $j < $length_b; null) {

if($a[$i] < $b[$j] && ++$i) {

continue;

}

if($a[$i] > $b[$j] && ++$j) {

continue;

}

$result[] = $a[$i];

if (isset($a[$next = $i + 1]) && $a[$next] != $a[$i]) {

++$j;

}

++$i;

}

return $result;

};

$result = array_shift($args);

sort($result);

foreach ($args as $arg) {

sort($arg);

$result = $intersect($result, $arg);

}

return $result;

}

$time = microtime(true);

$result = int_array_intersect($param_a, $param_b);

$time = microtime(true) - $time;

echo "int_array_intersect: {$time}\n";

?>

直觉上,我们肯定会认为内置函数快于自定义函数,但本例中结果恰恰相反:

array_intersect: 0.023918151855469

int_array_intersect: 0.0026049613952637

为什么?原因在于int_array_intersect操作的都是整数,而array_intersect操作的都是字符串,如果你传给它整数,它会做一步耗时的『(string)』类型转换操作。

注:测试结果基于PHP5.3.5,不同版本结论可能存在差异

php数组交集 效率,PHP数组交集的优化相关推荐

  1. Numpy 生成 Bool型数组、一维转多维数组reshape、多维转一维数组、替换数组元素、提取数组元素、数组交集、差集、过滤数组元素、二维数组反转行、交换数组维度

    1. 创建一个 [3,5] 所有元素为 True 的数组 In [162]: b = np.ones((3,5), dtype=bool)In [163]: b Out[163]: array([[ ...

  2. php多维数组交集,求数组差/交集函数-php数组函数(二)

    求数组差集函数 函数只检查了多维数组中的一维.可以用 array_diff($array1[0], $array2[0]) 检查更深的维度. u:自定义函数比较,a(association):同时比较 ...

  3. php 2个数组并集,php中数组的并集、交集和差集函数介绍_PHP教程

    在php中如果我想要对两个数组进行如并集.交集和差集操作,我们可直接使用php自带的函数来操作如array_merge(),array_intersect(),array_diff(). //计算数组 ...

  4. PHP数组函数 array_intersect (计算数组的交集,只比较值)

    在PHP中,数组函数 array_intersect () 用来计算多个数组的交集,交集计算时只比较数组元素的值.     函数语法: array_intersect ( array $array1 ...

  5. leetcode 986 、56 ——区间问题(数组区间的并集和交集)

    前缀和技巧 区间问题 1.区间的交集 1.1.题目 1.2.思路 1.3.题解 2.区间的并集 2.1.题目 2.2.思路 2.3.题解 区间问题 1.区间的交集 1.1.题目 原题链接 给定两个由一 ...

  6. java 数组效率_java数组复制的四种方法效率对比

    有关数组的基础知识,有很多方面,比方说初始化,引用,遍历,以及一维数组和二维数组,今天我们先看看数组复制的有关内容. 来源于牛客网的一道选择题: JAVA语言的下面几种数组复制方法中,哪个效率最高? ...

  7. Java数组与容器类分析资料--数组、List和Set、Map等

    2019独角兽企业重金招聘Python工程师标准>>> Java容器分析--数组 数组是Java语言内置的类型,除此之外,Java有多种保存对象引用的方式.Java类库提供了一套相当 ...

  8. Java数组与容器类分析资料--数组、List和Set、Map-asp.net关注

    数组是Java语言内置的类型,除此之外,Java有多种保存对象引用的方式.Java类库提供了一套相当完整的容器类,使用这些类的方法可以保存和操纵对象.下面分别进行讨论,在研究Java容器类之前,先了解 ...

  9. java中数组的含义_数组

    数组(Array)是有序的元素序列.[1] 若将有限个类型相同的变量的集合命名,那么这个名称为数组名.组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量.用于区分数组的各个元素的数 ...

最新文章

  1. kubernetes入门(04)kubernetes的核心概念(1)
  2. Android零基础入门第40节:自定义ArrayAdapter
  3. SAP TableControl 控制单个单元格输入
  4. 计算机组成原理白中英作业,计算机组成原理白中英部分作业解答(第二章)
  5. win32按钮按下不弹起_为什么厨房插座都不装五孔插座了?听电工一说,懊悔没早知道...
  6. 括号生成—leetcode22
  7. 平方环法_2019环法挑战赛加速诸暨“运动之城”建设 推动“体育+旅游”新热潮...
  8. java多个事件_window.onload绑定多个事件的两种解决方案
  9. mysql中group by的排序问题_Mysql之group by 和order by 一起用时的排序问题
  10. linux有关信号的FAQ
  11. php按城市显示搜索结果,在php错误中突出显示搜索结果
  12. 手把手!基于领域预训练和对比学习SimCSE的语义检索(附源码)
  13. Java SSM开发大众点评后端 Mybatis实战商城项目
  14. Android baidu地图定位实现签到打卡功能(附源码)
  15. 【欣赏】一组伤感唯美的图片
  16. C++学习心得和进阶路线总结
  17. 坚持玩游戏为什么会这么容易
  18. vue css 拖拽,vue----拖拽小方块
  19. TXT文件编码格式解析
  20. 舔砖加瓦(java)之多线程

热门文章

  1. 佳能单反相机二次开发包介绍_家用单反相机什么牌子好
  2. 预处理器命令必须作为第一个非空白空间启动_第三章 图形处理器(上)
  3. 通信原理包络是什么意思_罗茨鼓风机的应用及原理
  4. linux 6.5 gcc包,centos6.5离线安装gcc gcc++ rpm
  5. java换脸_随意换脸 · ink-image/api Wiki · GitHub
  6. Apache中access_log日志分析
  7. Windows下适用于PHP 7.1的memcache扩展工具编译
  8. lnmp应用服务器安装手册
  9. java中coverage怎么取消_别人家的ABM都是怎么成功的?
  10. MySQL修改数据类型语句