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 中的一些经验积累
Oct 09 PHP
php缓存技术介绍
Nov 25 PHP
Discuz 5.0 中读取纯真IP数据库函数分析
Mar 16 PHP
简单的PHP留言本实例代码
May 09 PHP
PHP stripos()函数及注意事项的分析
Jun 08 PHP
深入解析fsockopen与pfsockopen的区别
Jul 05 PHP
10个简化PHP开发的工具
Dec 25 PHP
php字符串替换函数substr_replace()用法实例
Mar 17 PHP
浅析Laravel5中队列的配置及使用
Aug 04 PHP
Yii2选项卡的简单使用
May 26 PHP
ThinkPHP 3使用OSS的方法
Jul 19 PHP
PDO::quote讲解
Jan 29 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环境搭建最新方法
2006/09/05 PHP
屏蔽浏览器缓存另类方法
2006/10/09 PHP
php下使用SimpleXML 处理XML 文件
2010/02/27 PHP
php异常处理使用示例
2014/02/25 PHP
php删除数组指定元素实现代码
2017/05/03 PHP
jQuery live
2009/05/15 Javascript
用JS实现一个TreeMenu效果分享
2011/08/28 Javascript
js中apply方法的使用详细解析
2013/11/04 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
2014/10/31 Javascript
基于bootstrap3和jquery的分页插件
2015/07/31 Javascript
jquery实现点击弹出带标题栏的弹出层(从右上角飞入)效果
2015/09/19 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
JS中的JSON对象的定义和取值实现代码
2018/05/09 Javascript
理理Vue细节(推荐)
2019/04/16 Javascript
vue-cli3中vue.config.js配置教程详解
2019/05/29 Javascript
js+canvas实现五子棋小游戏
2020/08/02 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
编写Python的web框架中的Model的教程
2015/04/29 Python
Python 读写文件和file对象的方法(推荐)
2016/09/12 Python
Tensorflow中的placeholder和feed_dict的使用
2018/07/09 Python
Python使用matplotlib绘制三维图形示例
2018/08/25 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
python-django中的APPEND_SLASH实现方法
2019/06/21 Python
Python3运算符常见用法分析
2020/02/14 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
基于python生成英文版词云图代码实例
2020/05/16 Python
python如何绘制疫情图
2020/09/16 Python
python的dict判断key是否存在的方法
2020/12/09 Python
德国户外商店:eXXpozed
2020/07/25 全球购物
寻找迷宫的一条出路,o通路;X:障碍
2016/07/10 面试题
机电一体化自荐信
2013/12/10 职场文书
农业开发项目建议书
2014/05/16 职场文书
学校安全教育月活动总结
2014/07/07 职场文书
初中生旷课检讨书范文
2014/10/06 职场文书
2014年中学生检讨书大全
2014/10/09 职场文书