【问题标题】:Find duplicate values in an array which creates a new array with key as duplicate keys and values as the dupes在数组中查找重复值,该数组创建一个新数组,其中键作为重复键,值作为重复项
【发布时间】:2013-07-29 17:15:17
【问题描述】:

我正在尝试在我的数组中查找所有重复项,并创建一个新数组,其中键作为重复值键,值作为其重复项的键

例子

[1] => 10
[2] => 11
[3] => 12
[4] => 12
[5] => 12
[6] => 13
[7] => 13

应用重复检查后,我只需要

[4] => [3] // value of key 4 is dupe of key 3
[5] => [3] // value of key 5 is dupe of key 3
[7] => [6] // value of key 7 is dupe of key 6

这让我得到了所有重复的键,但我需要重复的键,其值作为重复的键

$arr_duplicates = array_keys(array_unique( array_diff_assoc( $array, array_unique( $array ) ) ));

谢谢

【问题讨论】:

  • 什么?我需要一百万件东西?
  • @Neal 抱歉,很难解释我要解释的内容基本上我只需要将所有受骗者作为一个数组获取,但我的新数组的值应该是它们受骗的关键。
  • 为什么要编辑输出格式?不能有两个元素具有相同的键 (3)。
  • @RocketHazmat - 我添加了一些 cmets 来更详细地解释我需要什么
  • @user2619159:你仍然不能让键 3 等于 4 和 5(除非你把它做成一个数组)。

标签: php arrays


【解决方案1】:

试试这个,以获得比其他解决方案潜在的速度提升。但是会在大型数据集上使用更多内存。

<?php

$orig = array(
    1   => 10,
    2   => 11,
    3   => 12,
    4   => 12,
    5   => 12,
    6   => 13,
    7   => 13
);

$seen  = array();
$dupes = array();

foreach ($orig as $k => $v) {
    if (isset($seen[$v])) {
        $dupes[$k] = $seen[$v];
    } else {
        $seen[$v] = $k;
    }
}
unset($seen);

var_dump($dupes);

【讨论】:

  • 不错,速度很快
【解决方案2】:

这应该做你想做的事。循环遍历数组,看看值是否已经存在。如果是,请将其添加到结果中。

$arr_duplicates = array();
foreach($array as $k=>$v){
    // array_search returns the 1st location of the element
    $first_index = array_search($v, $array);
    // if our current index is past the "original" index, then it's a dupe
    if($k != $first_index){
        $arr_duplicates[$k] = $first_index;
    }
}

演示:http://ideone.com/Kj0dUV

【讨论】:

  • 将 $k &gt; $first_index 更改为 $k != $first_index 以使其以任意顺序处理索引,例如 $array = [7 =&gt; 13, 6 =&gt; 13]。
  • @RocketHazmat 这是一个很棒的功能,我之前也尝试过 foreach(),我唯一遇到的问题是,我正在处理非常大的数组,即 10000++ 记录,速度非常重要
  • @user2619159:你尝试的任何其他方法可能会更慢。您是否注意到此代码存在速度问题?如果没有,那么这可能不是问题:-P
  • 可以通过跟踪每个值的第一次出现来提高速度。你会用可能的速度提升来换取大量内存使用。
  • @Nate:我猜你可以缓存array_search 查找,这可能会更快,但我不确定多少。
猜你喜欢
  • 1970-01-01
  • 2012-05-12
  • 2021-03-29
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
  • 2015-08-02
  • 1970-01-01
相关资源
最近更新 更多