2013-07-29 136 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