如何比较数组中的项并只保留重复项的单个实例-PHP
我有大量的Wordpress帖子,每个帖子都是一个基本对象,如下所示: 此数组包含共享所有相同值(包括id)的重复对象。现在我有了数据,我希望对其进行分析,并且只保留数组中存在多个对象实例(或id键值的多个实例)的项目 例如,如果我有一个数组,它看起来像这样如何比较数组中的项并只保留重复项的单个实例-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' } ] 我只想保留
[
{ 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;
}
<>所以,如果你认为这是个问题,你可以删除这个部分。