【问题标题】:getting duplicate entries from array (instead of just removing them)从数组中获取重复条目(而不是仅仅删除它们)
【发布时间】:2014-07-18 20:03:46
【问题描述】:

我有一个可能包含重复值的数组,我不仅要删除它们(为此我使用array_unique),还要将它们提取到另一个数组中。

$a = array(1,2,2,3,4,4,5,6,6,6);
$b = array_unique($a); // has 1,2,3,4,5,6

我想要第三个数组 ($c),只包含重复项

也就是说,使用 [2,4,6] 或 [2,4,6,6](两者都可以)

最简单的方法是什么?

我尝试了$c = array_diff($a,$b),但给出了一个空数组,因为它正在从 $a 中删除所有出现的 $b(因为当然,它们在 $b 中至少出现一次)

我也想到了array_intersect,但它得到的数组和$a一模一样

php中有没有直接的函数来实现这个?怎么做?

【问题讨论】:

标签: php arrays duplicates


【解决方案1】:

我也在网上找到了这样的解决方案:

$c = array_unique( array_diff_assoc( $a, array_unique( $a ) ) );

不过好像不太容易理解

【讨论】:

  • 事实上,在发布我的问题后,我发现了同样的解决方案,它包含在 php array_unique 文档的评论中,here。它按预期工作(在我的示例中给出[2,4,6]),尽管正如您所说,理解它的工作原理并不容易。
  • 更新,事实上,只使用解决方案的内部部分 $c = array_diff_assoc($a,array_unique($a)) ,你会得到我的另一个预期结果 [2,4,6,6],耶!
【解决方案2】:

您可以使用array_count_values 计算每个元素的出现次数,并使用array_filter 仅保留出现多次的元素。

$a = array(1,2,2,3,4,4,5,6,6,6);
$b = array_count_values($a);
$c = array_filter($b,function($val){ return $val > 1; });
$c = array_keys($c);
print_r($c);

如果您的输入数组已排序,您可以通过遍历数组并检查前一个元素是否等于当前元素来找到欺骗

$a = array(1,2,2,3,4,4,5,6,6,6);
$dupes = array();

foreach($a as $i => $v) {
    if($i > 0 && $a[--$i] === $v)
        $dupes[] = $v;
}

print_r($dupes);

【讨论】:

    猜你喜欢
    • 2016-03-04
    • 1970-01-01
    • 2013-03-05
    • 2023-04-04
    • 1970-01-01
    • 2021-09-18
    • 2021-09-15
    • 2020-04-28
    • 2015-06-10
    相关资源
    最近更新 更多