小白因为经常用到多表查询,比如获取一个会员领取的卡卷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. Linux 操作系统的权限为什么是1,2,4 而不是 1,2,3?如何用二进制来做权限管理

    1.二进制做权限的优点 大家都知道,在Linux操作系统中,x - 可执行权限,w - 可写权限 , r - 可读权限.其权限值分别是1,2,4,但是有没有想过为什么是1,2,4 而不是 1,2,3 ...

  2. JS 简介

    JS 简介 JavaScript 是世界上最流行的编程语言. 这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记本电脑.平板电脑和智能手机等设备. avaScript 是脚本语言 J ...

  3. 剑指offer 28:字符串的排列

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述 输入 ...

  4. Spring Boot 2 + Redis例子

    Redis是一个key-value数据库,支持存储的value类型包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).在 ...

  5. Flutter中通过https post Json接收Json

    Flutter 已然成为炙手可热前端框架.若问跨平台到底有多香,自然是要多香有多香.今天我就分享这些天研究Flutter http连接和json格式转换的内容,小弟对Flutter也是小白一名,如有错 ...

  6. linux环境下卸载oracle 11g

    1.停库[oracle@testdb ~]$ sqlplus / as sysdbaSQL> shutdown immediateDatabase closed.Database dismoun ...

  7. Linux—系统管理

    查看Linux系统版本                                                                    CentOS系统 # centos7查看命 ...

  8. 2019-2020-1 20199305《Linux内核原理与分析》第四周作业

    MenuOS的构造 一.Linux源代码的关键目录 block:存放块设备管理代码: crypto:存放常见加密算法的C语言代码: Documentation:存放一些文档: drivers:驱动目录 ...

  9. 站点部署,IIS配置优化指南[转]

    站点部署,IIS配置优化指南 目录 一.       设置应用程序池默认设置 二.       常规设置 三.       优化回收策略 四.       性能 五.       IIS初始化(预加载 ...

  10. Redis思维导图

    Redis基本数据结构 1.String 1.1 数据结构 long len byte数组长度 long free 可用数组长度 char buff[] 数据内容 1.2 命令 键值:设置值通过字符串 ...