业务中需要统计一段时间投票独立的用户数,涉及到数组的排重,用传统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二维数组合并排重的两种方式相关推荐

  1. php多维数组合并_php多维数组合并

    * Arr.php namespace app\common\utils; class Arr { /** * 多维数组合并 例如关联数组配置项默认值处理 * @param $array1 * @pa ...

  2. 【转】系统缓存全解析二:动态缓存(2)-页面局部缓存的两种方式

    有时缓存整个页面是不现实的,因为页的某些部分可能在每次请求时都需要变化.在这些情况下,只能缓存页的一部分.顾名思义,页面部分缓存是将页面部分内容保存在内存中以便响应用户请求,而页面其他部分内容则为动态 ...

  3. Jackson:数组json字符串转对象集合(List)的两种方式

    首先,创建个实体类Person import java.util.List;public class Person {private String name;private Integer age;p ...

  4. php 二维数组 去重复,php二维数组合并及去重复的方法

    这篇文章主要介绍了php二维数组合并及去重复的方法,实例分析了php合并数组与删除重复项的技巧,需要的朋友可以参考下 本文实例讲述了php二维数组合并及去重复的方法.分享给大家供大家参考.具体实现方法 ...

  5. python三维变量合并_Python reshape的用法及多个二维数组合并为三维数组的实例

    reshape(shape) : 不改变数组元素,返回一个shape形状的数组,原数组不变.是对每行元素进行处理 resize(shape) : 与.reshape()功能一致,但修改原数组 In [ ...

  6. PHP - 二维数组合并的方式

    1.应用场景 有时需要二维数组(如从数据库查询的结果集)处理,如排序,过滤后才重新合并. 2.学习/实践 1. 文档 TBD 2. 整理输出 思路 都是循环遍历,只不过是选择使用语言自带的函数来实现, ...

  7. python二维数组变成三维数组_Python reshape的用法及多个二维数组合并为三维数组的实例...

    reshape(shape) : 不改变数组元素,返回一个shape形状的数组,原数组不变.是对每行元素进行处理 resize(shape) : 与.reshape()功能一致,但修改原数组 In [ ...

  8. 【C 语言】二级指针作为输入 ( 二维数组 | 抽象业务函数 | 二维数组打印函数 | 二维数组排序函数 )

    文章目录 一.抽象 二维数组 业务函数 1.二维数组 打印函数 2.二维数组 排序函数 二.完整代码示例 一.抽象 二维数组 业务函数 1.二维数组 打印函数 注意 , 二维数组 作为 函数参数 输入 ...

  9. python输入二维数组_Python输入二维数组方法

    Python输入二维数组方法 前不久对于Python输入二维数组有些不解,今日成功尝试,记以备忘.这里以输入1-9,3*3矩阵为例 n=int(input()) line=[[0]*n]*n for ...

最新文章

  1. centos pptp+l2tp+radius+mysql+tc限速,安装配置
  2. 微信浏览器禁止页面下拉查看网址
  3. 没有qpress_关于网站没反应的阿里云帮助中心问题解答
  4. WPF系列学习之三(路由事件)
  5. 12.映射表map.rs
  6. 密码学 专题 DH密钥交换算法
  7. 在单文档中显示我的第一个对话框
  8. 吴恩达机器学习笔记一
  9. CountDownLatch原理简介和使用过程
  10. oracle索引可以加到in,为什么你加的索引不管用?
  11. 赤小豆和红小豆有什么区别,哪种和薏米煮粥更好些?
  12. 转换FlashFxp站点和FtpRush站点的好工具
  13. odbc oracle数据源配置文件,MB中使用Oracle ODBC数据源的配置帮助
  14. 地方旅游网站源码,PHP开源,PC+WAP+微信三合一,免费分享
  15. DedeCMS顽固木马后门专杀工具
  16. 基于区块链的数字藏品管控方案
  17. 电影推介2017-01-07
  18. BBR 加速比收敛讲解python示例
  19. 进入xshell显示路径
  20. openlayer加载天地图 并设置地图颜色为科技蓝

热门文章

  1. 小学数学开灯问题_包含数学暑假答案的一年级数学假期作业题
  2. c语言读h5文件,我利用C语言实现SHA-256算法,需要从一个txt文件中读出数据并把...
  3. qthread destroyed while thread is still running
  4. NMS和roi pooling 实现以及加速
  5. libtorch 权重封装
  6. too many indices for tensor of dimension 3
  7. 矩形内接任意多边形抠图(可以羽化边缘)
  8. multiple definition of
  9. OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔总结
  10. Windows Servers双网卡绑定并配置IP地址