10

I have an sorted array which contains first names of people. This array has lots of names which are same.

I want to output only duplicate names.

Example,

input array:

Array
(
    [0] => Abbas
    [1] => Abhay
    [2] => Abhinav
    [3] => Abhishek
    [4] => Aditya
    [5] => Ahmed
    [6] => Ahmed
    [7] => Ajay
    [8] => Ajay
}

It should return

Array
(
    [5] => Ahmed
    [6] => Ahmed
    [7] => Ajay
    [8] => Ajay
}
hakre
  • 193,403
  • 52
  • 435
  • 836
Anil Dewani
  • 217
  • 1
  • 2
  • 14
  • you want to look at this : http://stackoverflow.com/questions/1170807/how-to-detect-duplicate-values-in-php-array – Nobita May 13 '11 at 16:42
  • Do you need to preserve the original index numbers? – webbiedave May 13 '11 at 16:45
  • @nobita That could help. But it only returns the number of time an value occured. Actually, is there any way to get keys of values which occurs more than once? – Anil Dewani May 13 '11 at 17:07

4 Answers4

19

Use this code:

# assuming your original array is $arr
array_unique(array_diff_assoc($arr, array_unique($arr)));

It will return unique duplicates but if you want non-unique duplicates then use:

array_diff_assoc($arr, array_unique($arr));

EDIT: Based on your comments, try this code:

$uarr = array_unique($arr);
var_dump(array_diff($arr, array_diff($uarr, array_diff_assoc($arr, $uarr))));

OUTPUT

array(4) {
  [5]=>
  string(5) "Ahmed"
  [6]=>
  string(5) "Ahmed"
  [7]=>
  string(4) "Ajay"
  [8]=>
  string(4) "Ajay"
}
anubhava
  • 761,203
  • 64
  • 569
  • 643
  • I tried array_diff_assoc($arr, array_unique($arr)); but it only returned element 6 and 8 from the example above. – Anil Dewani May 13 '11 at 17:03
1

You could use this function http://php.net/manual/en/function.array-unique.php to get an array withoutt he duplicate values, then you can use this function http://www.php.net/manual/en/function.array-intersect.php to find the differences, maintaining key association.

NightHawk
  • 3,633
  • 8
  • 37
  • 56
0

Try array_reduce:

http://php.net/manual/en/function.array-reduce.php

Create a callback that populates an array using the values from $input as keys, and increments them accordingly. And then filter those that appear more than once.

Denis de Bernardy
  • 75,850
  • 13
  • 131
  • 154
0

Using array_count_values() to count up everything in the array, then filter the resulting array to show only the ones where there's more than 1:

$input = array(.... your names here ....);

$counts = array_count_values($input);

$duplicates = array_filter($counts, function element { return ($element > 1) });

Doing that off the top of my head, but should be enough to get you started.

Marc B
  • 356,200
  • 43
  • 426
  • 500
  • Is there any way to know the keys whose values occured more than once? – Anil Dewani May 13 '11 at 17:19
  • $counts would have a set of `name => count` values in it. just look for the elements where count > 1, which is what the array_filter does. – Marc B May 13 '11 at 17:21