PHP 数组黑名单/白名单实例代码详解


Posted in PHP onJune 04, 2019

php里经常通过join查询得到的数据, 会有这种情况:

$data = [
  {id=>1,name=>a,age=>a},
  {id=>1,name=>b,age=>b},
  {id=>2,name=>c,age=>c},
  {id=>3,name=>f,age=>f},
  {id=>2,name=>d,age=>d},
];

这种格式的数据其实很常见, 实际上我们想要的数据效果是:

$data = [
  [id=>1,user_info=>[[name=>a,age=>a],[name=>b,age=>b]]],
  [id=>2,user_info=>[[name=>c,age=>c],[name=>d,age=>d]]],
  [id=>3,user_info=>[[name=>f,age=>f]]],
];

于是我们需要各种foreach处理其中函数;

这里记录一下, 两个函数

数组的黑名单:

/**
 * 数组获取黑名单内的数据
 * @param array $arr 源数组
 * @param array $list 白名单
 * @return array
 * @example
 * $arr = ['a'=>1,'b'=>2,'c'=>3,'d'=>4]
 * $list = ['d','c'];
 * $return = ['a'=>1,'b'=>2];
 */
public function array_black_list(Array $arr, Array $list)
{
  return array_diff_key($arr, array_flip($list));
}

数组的白名单

/**
 * 数组获取白名单内的数据
 * @param array $arr 源数组
 * @param array $list 白名单
 * @return array
 * @example
 * $arr = ['a'=>1,'b'=>2,'c'=>3,'d'=>4]
 * $list = ['d','c'];
 * $return = ['c'=>3,'d'=>4];
 */
public function array_white_list(Array $arr, Array $list)
{
  return array_intersect_key($arr, array_flip($list));
}

利用黑名单和白名单, 可以很容易实现上述数据格式转换:

/**
 * repeat数据处理(一般是leftJoin数据结构完善)
 * leftJoin 查询出来的多组数据, 根据primary_id进行数据结构修改, 保存为 字段=>[{},{},{}]类似结构
 * 效果:$data = [{id=>1,name=>a,age=>a},{id=>1,name=>b,age=>b},{id=>2,name=>c,age=>c},{id=>3,name=>null,age=>null}],$fieldArr = ['name','age']
 * return [{id=>1,repeat_info=>[{name=>a,age=>a},{name=>b,age=>b}]},{id=>2,repeat_info=>[{name=>c,age=>c}]},{id=>3,repeat_info=>[]}]
 * @param $data  array 原数据;
 * @param $fieldArr array 需要的字段,
 * @param string $primary_key 重复的数据 凭证;(一般用主键id)
 * @param string $repeat_name 重复的数据要保存数组的 字段名
 * @return array
 */
public function dealRepeatData(Array $data, Array $fieldArr, $primary_key = 'id', $repeat_name = 'repeat_info')
{
  $res = [];
  //通过黑名单获取不重复的值, 归并到按id分类的数组里;
  foreach ($data as $nre) {
    $res[$nre[$primary_key]] = $res[$nre[$primary_key]] ?? $this->array_black_list($nre, $fieldArr);
  }
  //通过白名单获取重复的值, 归并到黑名单的$repeat_name 字段里;
  foreach ($data as $re) {
    $res[$re[$primary_key]][$repeat_name][] = $this->array_white_list($re, $fieldArr);
  }
  return array_values($res);
}

总结

以上所述是小编给大家介绍的PHP 数组黑名单/白名单实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
PHPnow安装服务[apache_pn]失败的问题的解决方法
Sep 10 PHP
PHP中array_merge和array相加的区别分析
Jun 17 PHP
php后台如何避免用户直接进入方法实例
Oct 15 PHP
浅析php设计模式之数据对象映射模式
Mar 03 PHP
php处理json格式数据经典案例总结
May 19 PHP
PHP简单检测网址是否能够正常打开的方法
Sep 04 PHP
php中引用&的用法分析【变量引用,函数引用,对象引用】
Dec 12 PHP
php实现网页端验证码功能
Jul 11 PHP
实例讲解php将字符串输出到HTML
Jan 27 PHP
php fread函数使用方法总结
May 28 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
Aug 05 PHP
Laravel统一错误处理为JSON的方法介绍
Oct 18 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
Jun 03 #PHP
PHP使用CURL实现下载文件功能示例
Jun 03 #PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
Jun 03 #PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
Jun 03 #PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
Jun 03 #PHP
PHP工厂模式、单例模式与注册树模式实例详解
Jun 03 #PHP
使用SMB共享来绕过php远程文件包含的限制执行RFI的利用
May 31 #PHP
You might like
php读取图片内容并输出到浏览器的实现代码
2013/08/08 PHP
PHP中把对象转换为关联数组代码分享
2015/04/09 PHP
Avengerls vs KG BO3 第一场2.18
2021/03/10 DOTA
一直复略了的一个问题,关于表单重复提交
2007/02/15 Javascript
javascript 异常处理使用总结
2009/06/21 Javascript
JavaScript 保存数组到Cookie的代码
2010/04/14 Javascript
javascript取消文本选定的实现代码
2010/11/14 Javascript
基于jquery的从一个页面跳转到另一个页面的指定位置的实现代码(带平滑移动的效果)
2011/05/24 Javascript
jquery(hide方法)隐藏指定元素实例
2013/11/11 Javascript
JavaScript/Js脚本处理html元素的自定义属性解析(亲测兼容Firefox与IE)
2013/11/25 Javascript
JavaScript获得url所有参数键值表的方法
2015/03/21 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
jquery SweetAlert插件实现响应式提示框
2015/08/18 Javascript
VUE页面中加载外部HTML的示例代码
2017/09/20 Javascript
vue.js实例对象+组件树的详细介绍
2017/10/20 Javascript
微信小程序实战篇之购物车的实现代码示例
2017/11/30 Javascript
vue2.0 + ele的循环表单及验证字段方法
2018/09/18 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
python连接数据库的方法
2017/10/19 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
pandas pivot_table() 按日期分多列数据的方法
2018/11/16 Python
python爬虫爬取微博评论案例详解
2019/03/27 Python
python打印异常信息的两种实现方式
2019/12/24 Python
k-means 聚类算法与Python实现代码
2020/06/01 Python
python通过cython加密代码
2020/12/11 Python
雅萌 (YA-MAN) :日本美容家电领域的龙头企业
2017/05/12 全球购物
澳大利亚相机之家:Camera House
2017/11/30 全球购物
英国最大的体育&时尚零售公司:JD Sports
2017/12/13 全球购物
应用电子技术专业个人求职信
2013/09/21 职场文书
群众路线教育实践活动方案
2014/02/02 职场文书
住宿生擅自离校检讨书
2014/09/22 职场文书
高一学年自我鉴定范文(3篇)
2014/09/26 职场文书
大学生个人总结范文
2015/02/15 职场文书
《海上日出》教学反思
2016/02/23 职场文书
检讨书之工作不认真
2019/08/14 职场文书
Vue3中toRef与toRefs的区别
2022/03/24 Vue.js