欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-01-01 12:48:21
小白因为经常用到多表查询,比如获取一个会员领取的卡卷list,里面当然包含了1“会员优惠券记录表t_coupon_members”主表,然后2“门店优惠券表t_coupon”,和3“门店信息表t_shop”。连表关系是:主表1里的冗余字段门店优惠券coupon_id对应表2,然后表2的冗余字段sho ......

  小白因为经常用到多表查询,比如获取一个会员领取的卡卷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。

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

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

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

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

  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() : [];//门店信息

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

  5、接下来对 $shop_info 这个数组进行处理,让门店id成为键名,门店名称成为键值,可以用php自带的函数 array_column() ,具体用法说明可以参考

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

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

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

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

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

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

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