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 相关文章推荐
php explode函数实例代码
Feb 27 PHP
php中判断文件存在是用file_exists还是is_file的整理
Sep 12 PHP
curl实现站外采集的方法和技巧
Jan 31 PHP
浅谈PHP调用Webservice思路及源码分享
Jun 04 PHP
从零开始学YII2框架(三)扩展插件yii2-gird
Aug 20 PHP
PHP实现ftp上传文件示例
Aug 21 PHP
php使用iconv中文截断问题的解决方法
Feb 11 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
Dec 24 PHP
Symfony2安装的方法(2种方法)
Feb 04 PHP
thinkPHP框架动态配置用法实例分析
Jun 14 PHP
Laravel框架模型的创建及模型对数据操作示例
May 07 PHP
Laravel框架源码解析之模型Model原理与用法解析
May 14 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对象转换为数组函数(递归方法)
2012/02/04 PHP
解析php中eclipse 用空格替换 tab键
2013/06/24 PHP
thinkphp项目如何自定义微信分享描述内容
2017/02/20 PHP
Javascript在IE或Firefox下获取鼠标位置的代码
2009/12/18 Javascript
js 数值项目的格式化函数代码
2010/05/14 Javascript
js 与 php 通过json数据进行通讯示例
2014/03/26 Javascript
ie8下修改input的type属性报错的解决方法
2014/09/16 Javascript
javascript实现点击按钮让DIV层弹性移动的方法
2015/02/24 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
基于jquery实现简单的手风琴特效
2015/11/24 Javascript
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
使用JavaScript实现链表的数据结构的代码
2017/08/02 Javascript
修改Nodejs内置的npm默认配置路径方法
2018/05/13 NodeJs
微信小程序canvas拖拽、截图组件功能
2018/09/04 Javascript
小程序实现抽奖动画
2020/04/16 Javascript
Node.js爬虫如何获取天气和每日问候详解
2019/08/26 Javascript
JavaScript数组类型Array相关的属性与方法详解
2020/09/08 Javascript
vant-ui框架的一个bug(解决切换后onload不触发)
2020/11/11 Javascript
Python的Tornado框架异步编程入门实例
2015/04/24 Python
python基于socket实现网络广播的方法
2015/04/29 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
2017/11/16 Python
pandas把dataframe转成Series,改变列中值的类型方法
2018/04/10 Python
Python操作mongodb的9个步骤
2018/06/04 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
Pycharm+Python+PyQt5使用详解
2019/09/25 Python
python tornado修改log输出方式
2019/11/18 Python
python如何实现单链表的反转
2020/02/10 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
使用python实现多维数据降维操作
2020/02/24 Python
Python 如何实现访问者模式
2020/07/28 Python
Ubuntu20下的Django安装的方法步骤
2021/01/24 Python
NEW LOOK官网:英国时装零售巨头之一,快时尚品牌
2017/01/11 全球购物
装修五一活动策划案
2014/01/23 职场文书
诚信考试承诺书范文
2015/04/29 职场文书
uniapp 微信小程序 自定义tabBar 导航
2022/04/22 Javascript
Win11 Beta 预览版 22621.575 和 22622.575更新补丁KB5016694发布(附更新内容大全)
2022/08/14 数码科技