php 将二维数组合并,PHP二维数组合并排重的两种方式
业务中需要统计一段时间投票独立的用户数,涉及到数组的排重,用传统array_unique()发现,当数据量达到百万级后, 设置的1G内存都耗尽了,仍然没有统计完。而用array_flip()发现不仅可以统计出来,而且更快。
之前这两种方式没有比较过,数据量小的时候也没有遇到问题,发现差异,一直混用。特记录下两种方式。
待排重的二维数组简化格式如下:
$date_uids = [
'20190201' => ['6367662430', '6367662430', '5304950359', '5955228171', '6557239611'],
'20190202' => ['6367662430', '3699970002', '6619393423', '6026157677', '5476921392'],
];
方法一: 使用array_merge()结合array_unique()。
在遍历中array_merge()、array_unique()特别耗内存, 第9行,当以下count($uids) = 180万的时候,1G内存耗尽
// array_unique();
function distinct_uid_by_array_unique($datas) {
$uids = [];
foreach ($datas as $data) {
if (empty($data)) {
continue;
}
// 考虑先对$dara 使用array_unique()在合并。
$uids = array_unique(array_merge($uids, (array)$data));
}
return count($uids);
}
方法二:使用array_flip()和数组+合并。
去重总数为4572684,没有出现内存耗尽问题。
// array_flip();
function distinct_uid_by_array_flip($datas) {
$uids = [];
foreach ($datas as $data) {
if (empty($data)) {
continue;
}
$uids += array_flip($data);
}
return count($uids);
}
以上都是直观感受,具体执行时间差异和内存占用差异,还有待对比。针对一维数组排重array_unique()和array_flip()比较,傲雪星枫有一组比较数据,array_flip方法去重比使用array_unique方法运行时间减少98%,内存占用减少4/5,可参考比较细节:《php 数组元素快速去重》
综上,在实际开发中,遇到排重的情况,优先使用array_flip(),尽量不考虑array_unique()。
完整示例:
$date_uids = [
'20190201' => ['6367662430', '6367662430', '5304950359', '5955228171', '6557239611'],
'20190202' => ['6367662430', '3699970002', '6619393423', '6026157677', '5476921392'],
'20190203' => ['6367662430', '5971792803', '5516939770', '6579480643', '6399312379'],
];
// array_unique();
function distinct_uid_by_array_unique($datas) {
$uids = [];
foreach ($datas as $data) {
if (empty($data)) {
continue;
}
$uids = array_unique(array_merge($uids, (array)$data));
}
return count($uids);
}
// array_flip();
function distinct_uid_by_array_flip($datas) {
$uids = [];
foreach ($datas as $data) {
if (empty($data)) {
continue;
}
$uids += array_flip($data);
}
return count($uids);
}
$count = $total = 0;
if (!empty($date_uids) && is_array($date_uids)) {
$count = distinct_uid_by_array_unique($date_uids);
$total = distinct_uid_by_array_flip($date_uids);
}
var_dump($count, $total);die; // 12 12
注:另外发现MySQL distinct有两种写发
select count(distinct(fan_uid)) from energy_fan_feed_0972;
select count(distinct fan_uid) from energy_fan_feed_0972;
php 将二维数组合并,PHP二维数组合并排重的两种方式相关推荐
- php多维数组合并_php多维数组合并
* Arr.php namespace app\common\utils; class Arr { /** * 多维数组合并 例如关联数组配置项默认值处理 * @param $array1 * @pa ...
- 【转】系统缓存全解析二:动态缓存(2)-页面局部缓存的两种方式
有时缓存整个页面是不现实的,因为页的某些部分可能在每次请求时都需要变化.在这些情况下,只能缓存页的一部分.顾名思义,页面部分缓存是将页面部分内容保存在内存中以便响应用户请求,而页面其他部分内容则为动态 ...
- Jackson:数组json字符串转对象集合(List)的两种方式
首先,创建个实体类Person import java.util.List;public class Person {private String name;private Integer age;p ...
- php 二维数组 去重复,php二维数组合并及去重复的方法
这篇文章主要介绍了php二维数组合并及去重复的方法,实例分析了php合并数组与删除重复项的技巧,需要的朋友可以参考下 本文实例讲述了php二维数组合并及去重复的方法.分享给大家供大家参考.具体实现方法 ...
- python三维变量合并_Python reshape的用法及多个二维数组合并为三维数组的实例
reshape(shape) : 不改变数组元素,返回一个shape形状的数组,原数组不变.是对每行元素进行处理 resize(shape) : 与.reshape()功能一致,但修改原数组 In [ ...
- PHP - 二维数组合并的方式
1.应用场景 有时需要二维数组(如从数据库查询的结果集)处理,如排序,过滤后才重新合并. 2.学习/实践 1. 文档 TBD 2. 整理输出 思路 都是循环遍历,只不过是选择使用语言自带的函数来实现, ...
- python二维数组变成三维数组_Python reshape的用法及多个二维数组合并为三维数组的实例...
reshape(shape) : 不改变数组元素,返回一个shape形状的数组,原数组不变.是对每行元素进行处理 resize(shape) : 与.reshape()功能一致,但修改原数组 In [ ...
- 【C 语言】二级指针作为输入 ( 二维数组 | 抽象业务函数 | 二维数组打印函数 | 二维数组排序函数 )
文章目录 一.抽象 二维数组 业务函数 1.二维数组 打印函数 2.二维数组 排序函数 二.完整代码示例 一.抽象 二维数组 业务函数 1.二维数组 打印函数 注意 , 二维数组 作为 函数参数 输入 ...
- python输入二维数组_Python输入二维数组方法
Python输入二维数组方法 前不久对于Python输入二维数组有些不解,今日成功尝试,记以备忘.这里以输入1-9,3*3矩阵为例 n=int(input()) line=[[0]*n]*n for ...
最新文章
- centos pptp+l2tp+radius+mysql+tc限速,安装配置
- 微信浏览器禁止页面下拉查看网址
- 没有qpress_关于网站没反应的阿里云帮助中心问题解答
- WPF系列学习之三(路由事件)
- 12.映射表map.rs
- 密码学 专题 DH密钥交换算法
- 在单文档中显示我的第一个对话框
- 吴恩达机器学习笔记一
- CountDownLatch原理简介和使用过程
- oracle索引可以加到in,为什么你加的索引不管用?
- 赤小豆和红小豆有什么区别,哪种和薏米煮粥更好些?
- 转换FlashFxp站点和FtpRush站点的好工具
- odbc oracle数据源配置文件,MB中使用Oracle ODBC数据源的配置帮助
- 地方旅游网站源码,PHP开源,PC+WAP+微信三合一,免费分享
- DedeCMS顽固木马后门专杀工具
- 基于区块链的数字藏品管控方案
- 电影推介2017-01-07
- BBR 加速比收敛讲解python示例
- 进入xshell显示路径
- openlayer加载天地图 并设置地图颜色为科技蓝
热门文章
- 小学数学开灯问题_包含数学暑假答案的一年级数学假期作业题
- c语言读h5文件,我利用C语言实现SHA-256算法,需要从一个txt文件中读出数据并把...
- qthread destroyed while thread is still running
- NMS和roi pooling 实现以及加速
- libtorch 权重封装
- too many indices for tensor of dimension 3
- 矩形内接任意多边形抠图(可以羽化边缘)
- multiple definition of
- OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔总结
- Windows Servers双网卡绑定并配置IP地址