PHP循环查询结果去重并重组为指定排序结构的最优方案咨询
搞定PHP循环查询的结果优化:去重+重组指定排序的最优姿势
嘿,我来帮你解决这个问题!先看看你的场景:你现在用循环查数据库的代码是这样的:
$numbers = array ('1', '5', '10'); foreach ($numbers as $number){ $query[] = $this->db->query("SELECT name, country FROM name WHERE id= '" . (int)$number ."'"); }
跑出来的结果是一堆分散的数组:
Array ( Array ( name = ivan country = en ) Array( name = Peter country = en ) Array ( name = sisi's country = en ) )
现在要把它改成去重后,按指定顺序排列的结构:
Array( country = en name = array ( sisi's, Peter, Ivan ) )
我给你推荐从数据库查询到结果处理全链路的最优方案,既高效又易维护:
第一步:先把循环查询改成一次SQL请求(性能提升关键)
原来的循环查3次数据库,不仅慢还浪费资源,直接改成IN查询一次搞定:
$numbers = array('1', '5', '10'); // 先把ID转成整数,避免SQL注入风险 $safeIds = array_map('intval', $numbers); // 把ID拼成IN的条件字符串 $idStr = implode(',', $safeIds); // 一次查询拿到所有数据 $dbResult = $this->db->query("SELECT name, country FROM name WHERE id IN ($idStr)");
这样数据库只需要响应一次,性能直接上来了!如果你的数据里可能有重复的(比如同一个ID查出来多条一样的记录),还可以在SQL里加DISTINCT直接去重:
SELECT DISTINCT name, country FROM name WHERE id IN ($idStr)
第二步:处理结果集,实现去重+重组+指定排序
接下来我们把查出来的结果整理成你要的结构:
$finalOutput = []; // 先按country分组收集name,顺便去重 foreach ($dbResult as $row) { $country = $row['country']; $name = $row['name']; // 检查这个name是不是已经在对应country的列表里了,不在才加进去 if (!isset($finalOutput[$country]) || !in_array($name, $finalOutput[$country])) { $finalOutput[$country][] = $name; } } // 现在按你要的顺序排序:sisi's → Peter → Ivan // 先定义一个优先级数组,数字越小排越前面 $sortOrder = [ "sisi's" => 0, "Peter" => 1, "Ivan" => 2 ]; // 对每个country下的name列表做自定义排序 foreach ($finalOutput as $country => &$names) { usort($names, function($a, $b) use ($sortOrder) { return $sortOrder[$a] - $sortOrder[$b]; }); // 改成你要的结构 $finalOutput[$country] = [ 'country' => $country, 'name' => $names ]; } // 如果只有一个country(比如这里的en),直接取第一个结果就行 $finalResult = reset($finalOutput);
跑完这段代码,$finalResult就是你想要的结构啦:
Array( 'country' => 'en', 'name' => array ( "sisi's", "Peter", "Ivan" ) )
为啥说这是最优方案?
- 性能拉满:把多次数据库请求合并成一次,这是最影响效率的点,直接优化到位。
- 去重高效:遍历的时候就做去重判断,不用额外再跑一遍去重逻辑。
- 排序灵活:要是以后要改排序顺序,直接改
$sortOrder数组就行,不用动别的代码,扩展性超强。
内容的提问来源于stack exchange,提问作者user1141168
相关产品推荐
相关产品推荐

