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 相关文章推荐
下载文件的点击数回填
Oct 09 PHP
PHP stristr() 函数(不区分大小写的字符串查找)
Jun 03 PHP
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
Jun 16 PHP
在WINDOWS中设置计划任务执行PHP文件的方法
Dec 19 PHP
PHP中数组的分组排序实例
Jun 01 PHP
PHP中call_user_func_array回调函数的用法示例
Nov 26 PHP
php+Memcached实现简单留言板功能示例
Feb 15 PHP
thinkphp3.2.0 setInc方法 源码全面解析
Jan 29 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
Apr 08 PHP
Laravel 验证码认证学习记录小结
Dec 20 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
Aug 03 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学习之PHP表达式
2006/10/09 PHP
支付宝服务窗API接口开发php版本
2016/07/20 PHP
xml 封装与解析(javascript和C#中)
2009/07/26 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
2012/12/12 Javascript
Jquery解析Json格式数据过程代码
2014/10/17 Javascript
jQuery选择器源码解读(八):addCombinator函数
2015/03/31 Javascript
再JavaScript的jQuery库中编写动画效果的指南
2015/08/13 Javascript
js简单实现Select互换数据的方法
2015/08/17 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
JS基于HTML5的canvas标签实现炫目的色相球动画效果实例
2016/08/24 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
2017/05/17 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
2019/05/10 Javascript
ES6中的迭代器、Generator函数及Generator函数的异步操作方法
2019/05/12 Javascript
vuex根据不同的用户权限展示不同的路由列表功能
2019/09/20 Javascript
vue抽出组件并传值实例
2020/07/31 Javascript
js加减乘除精确运算方法实例代码
2021/01/17 Javascript
[03:23:49]2016.12.17日完美“圣”典全回顾
2016/12/19 DOTA
Python基础之函数用法实例详解
2014/09/10 Python
Python编写带选项的命令行程序方法
2019/08/13 Python
python智联招聘爬虫并导入到excel代码实例
2019/09/09 Python
python处理document文档保留原样式
2019/09/23 Python
python通过实例讲解反射机制
2019/10/17 Python
python3 requests库实现多图片爬取教程
2019/12/18 Python
Python+Appium实现自动化测试的使用步骤
2020/03/24 Python
python针对Oracle常见查询操作实例分析
2020/04/30 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
新西兰第一的行李箱网站:luggage.co.nz
2019/07/22 全球购物
迪卡侬中国官网:Decathlon中国
2020/08/10 全球购物
软件设计的目标是什么
2016/12/04 面试题
应届大学生自荐信格式
2013/09/21 职场文书
管理信息系学生的自我评价
2014/01/11 职场文书
租房合同协议书
2014/04/09 职场文书
党员承诺书怎么写
2014/05/20 职场文书
如何撰写促销方案?
2019/07/05 职场文书
nginx常用命令放入shell脚本详解
2021/03/31 Servers
vue elementUI表格控制对应列
2022/04/13 Vue.js