小白因为经常用到多表查询,比如获取一个会员领取的卡卷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. vue.js+THREE.js演示服务端3D模型流程总结

    three.js官网 ·场景搭建 使用npm或者其他获取安装three,就像npm i three,之后在需要演示模型的vue组件内import * as THREE from 'three',此时我 ...

  2. apk系统签名小技巧

    前言 对于经常和android系统打交道的攻城狮来说,给app打系统签名一定是日常操作啦.由于最近使用的比较多,特此总结一下,减少复制粘贴的操作,通过命令行来搞定. 简化前的操作 1.Android ...

  3. 树莓派Raspberry pi安装系统/烧录系统

    一:下载系统文件 1.树莓派官网系统下载链接:https://www.raspberrypi.org/downloads/raspbian/ (也可在百度云盘下载:https://pan.baidu. ...

  4. alluxio 安装记录及相关信息

    最近要尝试探究一下alluxio相关的知识,本博客进行对alluxio的安装过程进行备忘: 单例安装过程: https://docs.alluxio.io/os/user/stable/cn/cont ...

  5. Linux系统学习 二、测评-身份鉴别1

    身份鉴别 1)对登陆操作系统和数据库系统的用户进行身份表示和鉴别 1.密码文件中的口令字段是否不为空 2.检查各个用户主目录下的.rhosts文件 3.查看/etc/hosts.equiv 学习: 1 ...

  6. [Linux] shell中for循环grep正则统计指定关键字

    需求是统计某个业务的访问个数日志服务器上的目录结构是如下,搜索最近7天的指定关键字数据,并排重统计个数: drwxr-xr-x root root Nov : -- drwxr-xr-x root r ...

  7. EOJ Monthly 2019.11 E. 数学题(莫比乌斯反演+杜教筛+拉格朗日插值)

    传送门 题意: 统计\(k\)元组个数\((a_1,a_2,\cdots,a_n),1\leq a_i\leq n\)使得\(gcd(a_1,a_2,\cdots,a_k,n)=1\). 定义\(f( ...

  8. 0day2安全——笔记1

    第一章 PE和内存之间的映射 节偏移 文件偏移地址(File Offset Address):数据在PE文件中的地址 装载地址(Image Base):PE装入内存的基地址 虚拟内存地址(Virtua ...

  9. Java Web 学习(6) —— Spring MVC 之校验器

    Spring MVC 之校验器 数据验证 一个典型的 Spring MVC 应用会同时应用到 formatters/converters 和 validators. 在调用 controller 期间 ...

  10. nginx学习(五):nginx.conf 核心配置文件详解

    整体结构 详细信息 1.设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录或文件的一些权限,默认为nobody user root; 2.worker进程工作数设置,一般来 ...