You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:12:41