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

PHP如何对比数组元素并仅保留重复项的单个实例?

高效筛选WordPress文章数组中重复ID的条目

我来帮你搞定这个问题!你想要的是从包含大量WordPress文章的数组里,提取那些ID重复出现的条目,并且每个重复ID只保留一个实例对吧?你的嵌套循环不仅效率低,还没达到预期效果,咱们换个更优雅高效的方案来实现。

核心思路

要实现这个需求,我们可以分成三步:

  1. 统计数组中每个ID的出现次数
  2. 筛选出出现次数大于1的ID(也就是重复的ID)
  3. 遍历原数组,收集这些重复ID对应的条目,同时确保每个ID只添加一次

优化后的PHP实现

下面是高效的代码实现,时间复杂度为O(n),比嵌套循环的O(n²)性能提升明显,尤其适合处理大数组:

function returnOnlyDuplicates($allResults) {
    // 1. 提取所有文章ID并统计每个ID的出现次数
    $idCounts = array_count_values(array_column($allResults, 'ID'));
    
    // 2. 筛选出出现次数>1的ID,转成键为ID的数组(方便快速查找)
    $duplicateIdSet = array_flip(
        array_keys(
            array_filter($idCounts, function($count) {
                return $count > 1;
            })
        )
    );
    
    // 3. 收集重复ID对应的条目,每个ID只保留一个实例
    $parsedResults = [];
    $addedIds = [];
    
    foreach ($allResults as $item) {
        $currentId = $item->ID;
        // 检查当前ID是重复ID,且还没被添加到结果中
        if (isset($duplicateIdSet[$currentId]) && !isset($addedIds[$currentId])) {
            $parsedResults[] = $item;
            $addedIds[$currentId] = true;
        }
    }
    
    return $parsedResults;
}

代码解释

  • array_column($allResults, 'ID'):快速提取数组中所有文章的ID,得到一个纯ID数组
  • array_count_values():统计每个ID出现的次数,返回一个[ID => 次数]的关联数组
  • array_filter():过滤出次数大于1的ID,也就是重复的ID
  • array_flip():把重复ID数组转成[ID => true]的形式,这样用isset()查找ID的时间复杂度是O(1),比in_array()的O(n)快很多
  • 最后遍历原数组时,用$addedIds记录已经添加过的ID,确保每个重复ID只保留一个实例

测试示例

用你提供的示例数组测试:

$sampleArray = [
    (object)['ID' => 1, 'name' => 'hello world'],
    (object)['ID' => 2, 'name' => 'other post'],
    (object)['ID' => 1, 'name' => 'hello world']
];

print_r(returnOnlyDuplicates($sampleArray));

输出结果正好符合你的期望:

Array
(
    [0] => stdClass Object
        (
            [ID] => 1
            [name] => hello world
        )
)

为什么你的原代码不行?

你的嵌套循环有两个问题:

  1. 每当找到重复项时就会把当前$item加入结果,这会导致同一个重复ID的多个实例都被添加进去(比如ID=1的两个对象都会出现在结果里)
  2. 嵌套循环的时间复杂度是O(n²),数组越大,性能越差

内容的提问来源于stack exchange,提问作者Brady Edgar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:10:42