php数组交集 效率,PHP数组交集的优化
假设我们正在运营一个手机相关的网站,用户可以通过指定若干参数(如操作系统,屏幕分辨率,摄像头像素等等)来筛选自己想要的手机。不过由于手机的参数多,且不同的手机其参数差异大,所以参数表结构通常是纵表(一个参数是一行),而不是横表(一个参数是一列),此时使用若干参数来取结果,通常就是把每个单独参数来取结果,再一起取交集。
假定每个参数会包含一千个左右的产品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数组交集的优化相关推荐
- Numpy 生成 Bool型数组、一维转多维数组reshape、多维转一维数组、替换数组元素、提取数组元素、数组交集、差集、过滤数组元素、二维数组反转行、交换数组维度
1. 创建一个 [3,5] 所有元素为 True 的数组 In [162]: b = np.ones((3,5), dtype=bool)In [163]: b Out[163]: array([[ ...
- php多维数组交集,求数组差/交集函数-php数组函数(二)
求数组差集函数 函数只检查了多维数组中的一维.可以用 array_diff($array1[0], $array2[0]) 检查更深的维度. u:自定义函数比较,a(association):同时比较 ...
- php 2个数组并集,php中数组的并集、交集和差集函数介绍_PHP教程
在php中如果我想要对两个数组进行如并集.交集和差集操作,我们可直接使用php自带的函数来操作如array_merge(),array_intersect(),array_diff(). //计算数组 ...
- PHP数组函数 array_intersect (计算数组的交集,只比较值)
在PHP中,数组函数 array_intersect () 用来计算多个数组的交集,交集计算时只比较数组元素的值. 函数语法: array_intersect ( array $array1 ...
- leetcode 986 、56 ——区间问题(数组区间的并集和交集)
前缀和技巧 区间问题 1.区间的交集 1.1.题目 1.2.思路 1.3.题解 2.区间的并集 2.1.题目 2.2.思路 2.3.题解 区间问题 1.区间的交集 1.1.题目 原题链接 给定两个由一 ...
- java 数组效率_java数组复制的四种方法效率对比
有关数组的基础知识,有很多方面,比方说初始化,引用,遍历,以及一维数组和二维数组,今天我们先看看数组复制的有关内容. 来源于牛客网的一道选择题: JAVA语言的下面几种数组复制方法中,哪个效率最高? ...
- Java数组与容器类分析资料--数组、List和Set、Map等
2019独角兽企业重金招聘Python工程师标准>>> Java容器分析--数组 数组是Java语言内置的类型,除此之外,Java有多种保存对象引用的方式.Java类库提供了一套相当 ...
- Java数组与容器类分析资料--数组、List和Set、Map-asp.net关注
数组是Java语言内置的类型,除此之外,Java有多种保存对象引用的方式.Java类库提供了一套相当完整的容器类,使用这些类的方法可以保存和操纵对象.下面分别进行讨论,在研究Java容器类之前,先了解 ...
- java中数组的含义_数组
数组(Array)是有序的元素序列.[1] 若将有限个类型相同的变量的集合命名,那么这个名称为数组名.组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量.用于区分数组的各个元素的数 ...
最新文章
- kubernetes入门(04)kubernetes的核心概念(1)
- Android零基础入门第40节:自定义ArrayAdapter
- SAP TableControl 控制单个单元格输入
- 计算机组成原理白中英作业,计算机组成原理白中英部分作业解答(第二章)
- win32按钮按下不弹起_为什么厨房插座都不装五孔插座了?听电工一说,懊悔没早知道...
- 括号生成—leetcode22
- 平方环法_2019环法挑战赛加速诸暨“运动之城”建设 推动“体育+旅游”新热潮...
- java多个事件_window.onload绑定多个事件的两种解决方案
- mysql中group by的排序问题_Mysql之group by 和order by 一起用时的排序问题
- linux有关信号的FAQ
- php按城市显示搜索结果,在php错误中突出显示搜索结果
- 手把手!基于领域预训练和对比学习SimCSE的语义检索(附源码)
- Java SSM开发大众点评后端 Mybatis实战商城项目
- Android baidu地图定位实现签到打卡功能(附源码)
- 【欣赏】一组伤感唯美的图片
- C++学习心得和进阶路线总结
- 坚持玩游戏为什么会这么容易
- vue css 拖拽,vue----拖拽小方块
- TXT文件编码格式解析
- 舔砖加瓦(java)之多线程
热门文章
- 佳能单反相机二次开发包介绍_家用单反相机什么牌子好
- 预处理器命令必须作为第一个非空白空间启动_第三章 图形处理器(上)
- 通信原理包络是什么意思_罗茨鼓风机的应用及原理
- linux 6.5 gcc包,centos6.5离线安装gcc gcc++ rpm
- java换脸_随意换脸 · ink-image/api Wiki · GitHub
- Apache中access_log日志分析
- Windows下适用于PHP 7.1的memcache扩展工具编译
- lnmp应用服务器安装手册
- java中coverage怎么取消_别人家的ABM都是怎么成功的?
- MySQL修改数据类型语句