今天在南宁PHP群,有位大神提出一个当天的面试题。
如何优化以下代码,题目如下:
foreach ($lis as $row0){
foreach ($list as $row ) {
$array1 = pdo_fetchall('select * from table1 where '.'id='.$row['id'].' and sid='.$row0['sid']);
}
}
当时,我看到这个开始虽然觉得肯定有优化的地方,但是却没有思路。当然,我只是一个菜鸟。
下面给出群内高手优化后的代码:
if($list && $lis){
$ids = implode(',',array_column($list, 'id'));
$sids = implode(',',array_column($lis, 'sid'));
$array1 = pdo_fetchall('select * from table1 where id IN ('.$ids.') and sid IN ('.$sids.')');
}
明白了吧?虽然代码字数没有减少多少,但是分析可以看出,优化后的代码仅需要一次select查询即可得到上面循环两层才能得到的结果。
题目加强版,如何优化以下代码:
foreach ($lis as $row0){
foreach ($list as $row ) {
if($row['id']!=1 && $row0['sid']!=5) {
$array1 = pdo_fetchall('select * from table1 where '.'id='.$row['id'].' and sid='.$row0['sid']);
}
}
}
增加了两个条件,ID和SID不等于指定值。如上代码,我可能会在implode返回的数组再去操作去掉id=1和sid=5的值。
但是群内还是高手如云啊,请看如下代码:
if($list && $lis){
$ids = implode(',',array_column($list, 'id'));
$sids = implode(',',array_column($lis, 'sid'));
$array1 = pdo_fetchall('select * from table1 where id IN ('.$ids.') and sid IN ('.$sids.') AND id != 1 AND sid != 5');
}
如上代码,只需要在where条件排除这两个id就好,依然是一次查询。
然后,这位高手就说了一句,能一次查询的就不要分多次查询。