2013-07-29 135 views
2

我想在我的数组中找到所有重复项,并创建一个具有作为重复值键和值的键的新数组作为其重复在数组中创建一个新的数组作为重复的键和值作为重复的重复值

例的按键

[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)))); 

感谢

+0

Wha?我需要一百万件事物吗? – Neal

+0

@Neal 对不起,它很难解释我想解释的是什么 基本上我只需要获得所有的数组作为数组,但我的新数组的值应该是他们所迷惑的关键。 – user2619159

+2

你为什么要编辑输出格式?你不能有两个具有相同键的元素('3')。 –

回答

2

试试这个潜在的提升速度比其他解决方案。然而,将在大型数据集上使用更多的内存。

<?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); 
+0

不错,那非常快 – user2619159

1

这应该做你想要什么。循环访问数组,并查看该值是否已经存在。如果是这样,请将其添加到结果中。

$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; 
    } 
} 

DEMO:http://ideone.com/Kj0dUV

+0

将'$ k> $ first_index'更改为'$ k!= $ first_index',以使它能够以任何顺序处理索引,例如'$ array = [7 => 13,6 => 13]'。 – 2013-07-29 17:33:49

+0

@Nate:没想到,谢谢。 –

+0

@RocketHazmat这是一个很棒的功能, 我之前也尝试过foreach(),唯一的问题是,我正在处理非常大的数组,即10000 ++记录,速度非常重要 – user2619159