1. 程式人生 > >將資料庫查詢出來的二維陣列變成一維陣列

將資料庫查詢出來的二維陣列變成一維陣列

現在有角色表(shop_role : id , role_name),許可權表(shop_privilege : id , pri_name),角色許可權表(shop_role_privilege : role_id , pri_id)

要根據角色id選出其擁有的所有許可權id。

    $pids = M('RolePrivilege')->where(array('role_id'=>$id))->select();

使用 sql 查詢出資料庫資料如下是個二維陣列,現在我只想取 pri_id 這一列資料,可以使用 php 函式array_column(array,'col_name')實現。


    使用 : array_column($arr , 'pri_id' ); 之後獲取的資料如下是個一維陣列:


或者修改 sql 語句如下:

使用關鍵字 GROUP_CONCAT 連線欄位值

$pids = M('RolePrivilege')->field('GROUP_CONCAT(pri_id)')->where(array('role_id'=>$id))->select();
結果如下:


加個表名再轉為一維陣列,使用 select 方法返回的都是二維陣列,使用 find 方法返回就是一個一維陣列。

  $pids = M('RolePrivilege')->field('GROUP_CONCAT(pri_id) pri_id')->where(array('role_id'=>$id))->find();
結果如下:


 於是就可以進行相關操作了,簡便許多!

 比如資料庫查出資料如下(例如在表與表之間關係是一對多的關係時,同一條記錄內容基本相同,但是某個欄位由多條記錄組成):


SELECT clientSignRule. * , individualInteraction.`interaction` 
FROM  `client_sign_rule_t` clientSignRule
LEFT JOIN  `client_sign_rule_individual_interaction_t` individualInteraction ON clientSignRule.`id` = individualInteraction.`clientSignRuleId` 
WHERE 1 =1
AND clientSignRule.`id` =1

於是變成了兩條記錄(只有某個欄位值不同,這樣不好處理,於是我想把它整合到一條記錄中,如下結果):


sql 語句如下:

SELECT clientSignRule. * , GROUP_CONCAT( individualInteraction.`interaction` 
SEPARATOR  ',' ) AS interactions
FROM  `client_sign_rule_t` clientSignRule
LEFT JOIN  `client_sign_rule_individual_interaction_t` individualInteraction ON clientSignRule.`id` = individualInteraction.`clientSignRuleId` 
WHERE 1 =1
AND clientSignRule.`id` =1

主要利用 GROUP_CONCAT(欄位名 SEPARATOR '分隔符') 來將多個欄位值統一連線到一條記錄下的該欄位值。分隔符預設是逗號,即GROUP_CONCAT(欄位名) 即可得到上述結果。