PHP代码篇(二)-- array_column函数将二维数组格式化成固定格式的一维数组,及优化查询方法
小白因为经常用到多表查询,比如获取一个会员领取的卡卷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函数将二维数组格式化成固定格式的一维数组,及优化查询方法的更多相关文章
- phpcms抛出的二维数组转移到js,js中for....in遍历数组,用“.”连接来读出一维数组值
直切正题: 1.phpcms在模版中读出数组有很多中方法,如,{pc:content action="lists"}或{pc:get sql=""},经过{lo ...
- php 将一个二维数组转换成有父子关系的数组
<?php /** * Tree 树型类(无限分类) * * @author Kvoid * @copyright http://kvoid.com * @version 1.0 * @acce ...
- TypeScript入门(二)函数新特性
一.TypeScript-Rest and Spread操作符 用来声明任意数量的方法参数 ...args中的...就是Rest and Spread操作符. 例1: 声明一个可以传任意数量的参数进 ...
- C语言指针系列 - 一级指针.一维数组,二级指针,二维数组,指针数组,数组指针,函数指针,指针函数
1. 数组名 C语言中的数组名是一个特殊的存在, 从本质上来讲, 数组名是一个地址, 我们可以打印一个指针的值,和打印一个数组的值来观察出这个本质: int nArray[10] ={ 0 }; in ...
- c语言程序设计案例教程(第2版)笔记(二)—函数、递归
零散知识点 模块化:将一个问题分解成若干个子问题的过程成为模块化. 模块化的优点:不但可以将一个复杂的问题分解成几个相对简单的问题:还可以提高程序代码的重用性. 函数:函数是构成C程序的基本单位.函数 ...
- java基础5 (一维)数组和二维数组
本文知识点(目录): 一维数组(一维数组的概念.优点.格式.定义.初始化.遍历.常见异常.内存分析以及常见操作(找最大值.选择排序.冒泡排序等等)) 二维数组(二维数组的遍历.排序.查找.定义. ...
- php将二维数组转换成我想要的一维数组
使用方法array_column($array,b,$arr): 参数说明:$array是我们原始的二维数组,B是我们想要的values,c是key 举个栗子:这是我原来的二维数组 这是我需要的一维数 ...
- PHP 统计一维数组value同样的元素的个数num,并将其转化为下标为数字,值是value和num的二维数组
近期做一个项目.从数据库查询某个字段得到一个数组key是数字值是channel的一维数组$res,现须要将这个数组变成键是数字值是channel和num(num为同样channel的数量,默觉得0). ...
- php 数组去重 (一维数组与二维数组)
数组中重复项的去除 一维数组的重复项: 使用array_unique函数即可,使用实例如下: <?php $aa=array("apple" ...
随机推荐
- Implement Dependent Reference Properties 实现从属引用属性 (XPO)
In this lesson, you will learn how to implement properties whose values can depend on other properti ...
- .netcore 文件上传转为base64位字符串
.netcore文件上传Api接口,和正常的webForm提交类似,只是用postman测试接口时,记得给form表单命名,否则获取上传文件数量一直为0 后端代码 using System; usin ...
- OpenCV:图像的按位运算
首先导包: import numpy as np import cv2 import matplotlib.pyplot as plt def show(image): plt.imshow(imag ...
- How to Check Device UUID or File System UUID. (Doc ID 1505398.1)
How to Check Device UUID or File System UUID. (Doc ID 1505398.1) APPLIES TO: Linux OS - Version Orac ...
- 一行代码在Linux服务器上搭建基于.Net Core的博客
如果你有一台Linux服务器(CentOS7+ 或者 Ubuntu 16.04+)可以使用以下命令快速搭建一个博客. curl http://cdn.zkeasoft.com/zkeacms-blog ...
- Less(3)
1.先判断注入类型 (1)首先看到要求,要求传一个ID参数,并且要求是数字型的:?id=1 (2)再输入?id=1' 显示报错,报错信息多了一个括号,判断接收到的参数可能为id=('1') (3)输入 ...
- Spring Cloud 教程
Spring Cloud系列教程: Spring Boot + Spring Cloud 构建微服务系统(一):服务注册和发现(Consul) Spring Boot + Spring Cloud 构 ...
- golang数据结构之选择排序
//SelectSort 选择排序 func SelectSort(arr *[]int) { ; i < len(arr); i++ { tmp := arr[i] index := i ; ...
- 【JS】JS校验密码复杂度(必须包含字母、数字、特殊符号)
#场景一:密码中必须包含大小写 字母.数字.特称字符,至少8个字符,最多30个字符: var pwdRegex = new RegExp('(?=.*[0-9])(?=.*[A-Z])(?=.*[a- ...
- git 添加add readme.txt 报fatal: pathspec 'readme.txt' did not match any files错误
刚刚接触git版本管理器,跟着廖雪峰老师的git教程学习,在创建一个新的文件时,使用的是$ git add readme.txt指令,但是报出fatal: pathspec 'readme.txt' ...