从数组中删除唯一元素


Remove unique elements from array

所以我一直在尝试找到一种解决方案来从对象数组中删除唯一元素并保留重复项,但几乎所有问题都在于如何删除重复项。

数组如下所示:

[{"No":"123","Product":"Name X","Color":"blue"},
 {"No":"123","Product":"Name X","Color":"green"},
 {"No":"456","Product":"Name X2","Color":"red"},
 {"No":"456","Product":"Name X2","Color":"blue"},
 {"No":"789","Product":"Name X3","Color":"yellow"}]

我需要检查No它是否是唯一的,如果是,则需要将其删除。之后数组将如下所示:

[{"No":"123","Product":"Name X","Color":"blue"},
 {"No":"123","Product":"Name X","Color":"green"},
 {"No":"456","Product":"Name X2","Color":"red"},
 {"No":"456","Product":"Name X2","Color":"blue"}]

我尝试首先只获取重复项(MySQL),但所有解决方案都涉及使用 GROUP BYHAVING,它们只返回重复的行,但也将它们组合在一起。

因此,您要删除仅出现一次的数字。您可以通过两次"传递"执行此操作。

首先,建立数字列表以及它们出现的频率:

$numbers = array_reduce(
    $input,
    function($carry,$value) {
        if( !isset($carry[$value['No']])) $carry[$value['No']] = 0;
        $carry[$value['No']]++;
        return $carry;
    },
    []
);
$uniques = array_filter($numbers,function($n) {return $n == 1;});

现在,您有一个唯一编号的列表。因此,您可以删除与这些数字匹配的那些。

$result = array_filter(
    $input,
    function($item) use ($uniques) {
        return !isset($uniques[$item['No']]);
    }
);

做。

我会选择这样的东西:

$db_result = array(); // Your array with duplicates
$count_occurrences = array();
foreach($db_result as $k=>&$v)
{
    $count_occurrences[$v['No']] = array(
        'key'=>$k,
        'count'=>(isset($count_occurrences[$v['No']]['count']) ? ($count_occurrences[$v['No']]['count'] + 1) : 1)
    );
}
unset($v);
foreach($count_occurrences as &$v)
{
    if($v['count'] === 1)
    {
        unset($db_result[$v['key']]);
    }
}
unset($v);