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確實有很多豐富的函數方法,可以滿足主流業務需求,只是不知道,所以寫了大量冗余代碼┭┮﹏┭┮,老猿的經驗確實值得贊贊。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM