利用数组拼接来代替连表查询

有时候多表连表查询比较麻烦容易出错,效率上也不一定有单表快。我们可以用单表查询来代替连表查询。

单表查询需要用把结果拼接起来。

情形:表A,表B  关系 在B表中a_id = A表中id。表A与表B是1对多的关系或者是1对1的关系

$ar =$db->('select * form A  where 条件 ')

$ar 二维数组

$ids=array_column($ar,'id');

$br=$db->('select * from B where a_id in ('.join(',',$ids).') ');//二维数组

算法1:常规思路,用两个数循环判断
    foreach($ar as $k=>$v){
       foreach($br as $k1=>$v1){
        if($v['id']==$v1['a_id']){
        $ar[$k]['b_list'][]=$v1;
        }
      }
   }

以上这种思路代码逻辑清晰,不过两个foreach循环,感觉不太好。

算法2:先把数组$br用一个新数组拼装下,在与数组$ar拼接

$cr=[];
foreach($br as $k=>$v){
  $cr[$v['a_id']][]=$v; //如果A与B是一对一关系:$cr[$v['a_id']]=$v; 
}

foreach($ar as $k=>$v){
   if(isset($cr[$v['id']])){
      $ar[$k]['b_list']=$cr[$v['id']];
   }else{
      $ar[$k]['b_list']=[];
   }
}

这种算法虽然代码多点,却仅仅循环了两次就得到了结果。比算法1更好










你可能感兴趣的:(PHP)