如何比较数组中的项并只保留重复项的单个实例-PHP

如何比较数组中的项并只保留重复项的单个实例-PHP,php,arrays,filtering,Php,Arrays,Filtering,我有大量的Wordpress帖子,每个帖子都是一个基本对象,如下所示: 此数组包含共享所有相同值(包括id)的重复对象。现在我有了数据,我希望对其进行分析,并且只保留数组中存在多个对象实例(或id键值的多个实例)的项目 例如,如果我有一个数组,它看起来像这样 [ { id: 1, name: 'hello world' }, { id: 2, name: 'other post' }, { id: 1, name: 'hello world' } ] 我只想保留

我有大量的Wordpress帖子,每个帖子都是一个基本对象,如下所示:

此数组包含共享所有相同值(包括id)的重复对象。现在我有了数据,我希望对其进行分析,并且只保留数组中存在多个对象实例(或id键值的多个实例)的项目

例如,如果我有一个数组,它看起来像这样

[
     { id: 1, name: 'hello world' },
     { id: 2, name: 'other post' },
     { id: 1, name: 'hello world' }
]
我只想保留重复对象的一个实例。因此,我的函数将返回以下结果:

returnOnlyDuplicates(array)
^ returns => [{ id: 1, name: 'hello world' }]
我被困在这个过滤掉“只重复”这项任务的一部分。我试图避免只使用for循环和遍历所有内容,因为这可能非常耗时,所以我正在寻找一个更优雅的解决方案

目前这就是我所拥有的,但它不做任何类型的过滤,
$parsedResults
只在完成所有操作后返回与
$allResults
完全相同的数组

  $allResults = [{data}, {data}, {data}];
  $parsedResults = [];

  foreach ($allResults as $item) {
     $isFound = false;

     foreach ($allResults as $compare) {
        if ($compare->ID == $item->ID) {
           if ($isFound === false) {
              $isFound = true;
           } else {
              array_push($parsedResults, $item);
           }
        }
     }
  }

  return parsedResults;

按id对对象进行分组

foreach ($allResults as $object) {
    $grouped[$object->id][] = $object;
}
筛选出只有一项的任何组

$duplicates = array_filter($grouped, function($group) {
    return count($group) > 1;
});
从每组中选出第一项作为结果

$result = array_map('reset', $duplicates);

请注意,由于
array\u filter
array\u map
保留键,因此
$result
中的键将是对象ID。

我没有测试它,但您可以尝试以下方法:

function unique_multidim_array($array, $key) { 
    $temp_array = array(); 
    $i = 0; 
    $key_array = array(); 
    
    foreach($array as $val) { 
        if (!in_array($val[$key], $key_array)) { 
            $key_array[$i] = $val[$key]; 
            $temp_array[$i] = $val; 
        } 
        $i++; 
    } 
    return $temp_array; 
   }
然后像这样使用它:

$allResults = unique_multidim_array($allResults,'id'); 

您可能希望节省一些内存,只保留一个数组作为查找,并使用
array\u filter()
将数组减少为重复数组

<?php

$posts = [
    ['id' => 1, /* more values */],
    ['id' => 2, /* more values */],
    ['id' => 1, /* more values */],
    ['id' => 3, /* more values */],
    ['id' => 1, /* more values */],
    ['id' => 3, /* more values */],
];

function get_duplicates($array) {
    $seen = [];

    return array_filter($array, function ($v) use (&$seen) {
        $identity = $v['id'];
        if (empty($seen[$identity])) {
            $seen[$identity] = 1;
            return false;
        }
        ++$seen[$identity];
        return $seen[$identity] == 2;
    });
}

$duplicates = get_duplicates($posts);

这可能会解决您的问题:

$countObjectFound = [];
$duplicatedObjects = [];

foreach ($allObjects as $object) {
    if (empty($countObjectFound[$object->id])) {
        $countObjectFound[$object->id] = 0;
    }

    $countObjectFound[$object->id]++;

    if ($countObjectFound[$object->id] == 2) {
        $duplicatedObjects[] = $object;
    }
}
以下部分仅用于避免未定义的偏移量
通知错误:

    if (empty($countObjectFound[$object->id])) {
        $countObjectFound[$object->id] = 0;
    }
<>所以,如果你认为这是个问题,你可以删除这个部分。