小白因为经常用到多表查询,比如获取一个会员领取的卡卷list,里面当然包含了1“会员优惠券记录表t_coupon_members”主表,然后2“门店优惠券表t_coupon”,和3“门店信息表t_shop”。连表关系是:主表1里的冗余字段门店优惠券coupon_id对应表2,然后表2的冗余字段shop_id对应表3的店铺id。所以直接3表联查即可获取,但是被告知需要优化,下面是优化结果。

一、如何优化

  1、这边优化是,直接主表1和主表2联查获取到一个带有门店id的二维数组$list,然后通过门店id进行数据库IN语句查询出满足条件的门店信息$shop_info,然后循环$list,通过PHP数组处理函数array_column,将$shop_info匹配到$list中。如下是具体实现步骤,代码框架TP5.1。

二、具体步骤

  1、连表获取表1和表2的数组

$list = $this->alias('M1')
->field('M1.id,M1.status,M1.member_id,M1.writer_time,
M2.coupon_name,M2.shop_id,M2.type,M2.type_value1,M2.type_value2,M2.use_start_time,M2.use_end_time
')
->join('t_coupon M2','M1.coupon_id = M2.id','left')
->where($where)
->page($page + 1,$psize)
->select();
$list ? $list = $list->toArray() : [];

  2、结果如下图2,这里要注意,为什么要用  ->toArray(),因为在TP5.1里面 ->select() 查询返回的是一个对象,有人可能说我用 dump() ,打印显示的是一个数组呀,这个我也是用 数组函数 array_column,报错提示参数必须是一个数组,才发现。原来 dump() 是TP5.1对它进行了封装,大家可以用PHP自带的 var_dump() 打印一下就明白了,如图1。

  3、拿到带有门店的shop_id后,我们再对它进行数组处理,获取一个IN语句使用数组,类似【4,5】这样的,代码如下:

$shop_id = array_column($list,"shop_id");//格式化门店ID

  4、这样我们就可以直接一条SQL IN语句获取当前$list里面所有的门店信息的$shop_info 了,代码如下:

$shops_model = new Shops();
$shop_info = $shops_model->where('id','IN',$shop_id)->field('id,shop_name')->select();
$shop_info ? $shop_info = $shop_info->toArray() : [];//门店信息

  5、接下来对 $shop_info 这个数组进行处理,让门店id成为键名,门店名称成为键值,可以用PHP自带的函数 array_column() ,具体用法说明可以参考https://www.php.net/manual/zh/function.array-column.php

$shop_info = array_column($shop_info,"shop_name","id");

  6、最后我们,直接循环 foreach $list,将处理好的门店信息添加到数据源中,得到效果如下。

foreach($list as $k=>$v){
$list[$k]['shop_name'] = $shop_info[$v['shop_id']];
}

ps:其实最开始我是直接在循环$list里面的时候,直接数据库查询门店信息,但是被告知这样不好,要秉承尽量少在循环里面做查询动作,然后询问老猿使用 array_column() ,确实效果很好。

  呃,这个主要是对 array_column() 的使用做说明,感觉确实PHP确实有很多丰富的函数方法,可以满足主流业务需求,只是不知道,所以写了大量冗余代码┭┮﹏┭┮,老猿的经验确实值得赞赞。

PHP代码篇(二)-- array_column函数将二维数组格式化成固定格式的一维数组,及优化查询方法的更多相关文章

  1. phpcms抛出的二维数组转移到js,js中for....in遍历数组,用“.”连接来读出一维数组值

    直切正题: 1.phpcms在模版中读出数组有很多中方法,如,{pc:content action="lists"}或{pc:get sql=""},经过{lo ...

  2. php 将一个二维数组转换成有父子关系的数组

    <?php /** * Tree 树型类(无限分类) * * @author Kvoid * @copyright http://kvoid.com * @version 1.0 * @acce ...

  3. TypeScript入门(二)函数新特性

    一.TypeScript-Rest and Spread操作符 用来声明任意数量的方法参数  ...args中的...就是Rest and Spread操作符. 例1: 声明一个可以传任意数量的参数进 ...

  4. C语言指针系列 - 一级指针.一维数组,二级指针,二维数组,指针数组,数组指针,函数指针,指针函数

    1. 数组名 C语言中的数组名是一个特殊的存在, 从本质上来讲, 数组名是一个地址, 我们可以打印一个指针的值,和打印一个数组的值来观察出这个本质: int nArray[10] ={ 0 }; in ...

  5. c语言程序设计案例教程(第2版)笔记(二)—函数、递归

    零散知识点 模块化:将一个问题分解成若干个子问题的过程成为模块化. 模块化的优点:不但可以将一个复杂的问题分解成几个相对简单的问题:还可以提高程序代码的重用性. 函数:函数是构成C程序的基本单位.函数 ...

  6. java基础5 (一维)数组和二维数组

    本文知识点(目录): 一维数组(一维数组的概念.优点.格式.定义.初始化.遍历.常见异常.内存分析以及常见操作(找最大值.选择排序.冒泡排序等等))    二维数组(二维数组的遍历.排序.查找.定义. ...

  7. php将二维数组转换成我想要的一维数组

    使用方法array_column($array,b,$arr): 参数说明:$array是我们原始的二维数组,B是我们想要的values,c是key 举个栗子:这是我原来的二维数组 这是我需要的一维数 ...

  8. PHP 统计一维数组value同样的元素的个数num,并将其转化为下标为数字,值是value和num的二维数组

    近期做一个项目.从数据库查询某个字段得到一个数组key是数字值是channel的一维数组$res,现须要将这个数组变成键是数字值是channel和num(num为同样channel的数量,默觉得0). ...

  9. php 数组去重 (一维数组与二维数组)

    数组中重复项的去除 一维数组的重复项: 使用array_unique函数即可,使用实例如下: <?php                   $aa=array("apple" ...

随机推荐

  1. GO基础之切片

    一.什么是切片 Go语言切片是对数组的抽象. Go数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"): 与数组相比切 ...

  2. 使用Kubernetes进行ProxySQL本机群集

    自v1.4.2起,ProxySQL支持本机群集.这意味着多个ProxySQL实例可识别群集; 他们了解彼此的状态,并能够通过根据配置版本,时间戳和校验和值同步最新的配置来自动处理配置更改. Proxy ...

  3. dedecmsV5.7 arclist 如何调用副栏目的文章

    问题:用arclist 调用某个栏目下的文章的时候,发现无法调用出副栏目是这个栏目的文章. 然后就上百度搜了一番,记录一下我搜到的解决方法: 1.打开/include/taglib/arclist.l ...

  4. css字体标签相关

    斜体: i:斜体em:斜体,强调的意思,有特殊含义,尽量用i或者cssfont-style:字体风格 normal默认值,italic斜体,oblique倾斜的字体 粗体: b,strong:粗体fo ...

  5. 关于xshell连接limux界面按退格键不正常的问题

    这个问题通过修改xshell终端属性可以解决,步骤如下: "文件" -> "属性" -> "终端" -> "键盘 ...

  6. Linux—vi/vim命令详解

    如何在 vi 里搜索关键字 在命令模式下敲斜杆( / )这时在状态栏(也就是屏幕左下脚)就出现了 "/" 然后输入你要查找的关键字敲回车就行了. 如果你要继续查找此关键字,敲字符 ...

  7. linux内核的冷热页分配器

    先说说cpu的cache,和cpu的cache比起来访问主内存是非常慢的,为了加快速度根据本地性原则,cpu在访问主内存的时候会把附近的一块数据都加载到cpu的cache里,之后读写这块数据都是在ca ...

  8. Delphi 任务栏中不显示窗口

    目的: 1. 窗口不在任务栏显示. 2. 窗口不显示在Alt+Tab的切换列表中. 3. 在任务管理器的应用程序列表中不显示. 示例: type TAppWndBrowser = class( TFo ...

  9. Java总结转载,持续更新。。。

    1.Java中内存划分 https://www.cnblogs.com/yanglongbo/p/10981680.html

  10. 201871010102-常龙龙《面向对象程序设计(java)》第一周学习总结

    博文正文开头:(3分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/p/11435127.html 这个作业的要求在哪里 https://e ...