Reputation: 1777
I am working with a one dimensional array in PHP. I would like to detect the presence of duplicate values, then count the number of duplicate values and output the results. For example, given the following array:
$array = [
'apple',
'orange',
'pear',
'banana',
'apple',
'pear',
'kiwi',
'kiwi',
'kiwi'
];
I would like to print:
apple (2)
orange
pear (2)
banana
kiwi (3)
Any advice on how to approach this problem?
Upvotes: 137
Views: 255025
Reputation: 47874
Loop over the keys and values returned by array_count_values()
and conditionally print the number of occurrences if greater than one.
Code: (Demo)
foreach (array_count_values($array) as $value => $count) {
printf("%s%s\n", $value, $count > 1 ? " ($count)" :'');
}
Upvotes: 0
Reputation: 479
function array_not_unique( $a = array() )
{
return array_diff_key( $a , array_unique( $a ) );
}
Result: (Demo)
array (
4 => 'apple',
5 => 'pear',
7 => 'kiwi',
8 => 'kiwi',
)
Upvotes: 47
Reputation: 23
$arr = [1,2,2,2,4,5,5,5,8,9,10,2,5,9,10,10];
array_count_values($arr);
// OUT PUT Array(
// 2 => 4
// 5 => 4
// 9 => 2
// 10 => 3
// )
// If you want unique items
$items = array_keys( array_intersect( array_count_values($arr), [1] ) )
//If you want duplicate items
$duplicates = array_keys( array_diff( array_count_values($arr), [1] ) )
Upvotes: 1
Reputation: 27
This function give you the redundant values only
function array_find_redundant($A){
$U=$N=[];
foreach($A As $k=>$v){
if(in_array($v,$U)){$N[$k]=$v;}else{$U[]=$v;}
}
return $N;
}
$A = ['A','B','B','C','C','C'];
$B = array_find_redundant($A); // [2=>'B',4=>'C',5=>'C']
Upvotes: 1
Reputation: 11
function array_not_unique(array $array): array
{
$duplicate_array = array_diff_key( $array , array_unique( $array ) );
$unique_array = [];
foreach ($array as $key => $value) {
if ( in_array($value, $duplicate_array)) {
$duplicate_array[$key] = $value;
}
else {
$unique_array[$key] = $value;
}
}
return ["unique_array" => $unique_array, "duplicate_array" => $duplicate_array];
}
Upvotes: 1
Reputation: 39
$data = ['outer', 'inner', 'sole', 'sole', 'outer', 'outer'];
$result = max(array_count_values($data));
if($result > 1) {
echo 'Duplicate items were found!';
}
I think this way is shorter and cleaner.
Upvotes: 1
Reputation: 11
A simple method:
$array = array_values(array_unique($array, SORT_REGULAR));
Upvotes: -1
Reputation: 207
I didn't find the answer I was looking for, so I wrote this function. This will make an array that contains only the duplicates between the two arrays, but not print the number of times an element is duplicated, so it's not directly answering the question, but I'm hoping it'll help someone in my situation.
function findDuplicates($array1,$array2)
{
$combined = array_merge($array1,$array2);
$counted = array_count_values($combined);
$dupes = [];
$keys = array_keys($counted);
foreach ($keys as $key)
{
if ($counted[$key] > 1)
{$dupes[] = $key;}
}
sort($dupes);
return $dupes;
}
$array1 = [1,2,3,4,5];
$array2 = [4,5,6,7,8];
$dupes = findDuplicates($array1,$array2);
print_r($dupes);
Outputs:
Array
(
[0] => 4
[1] => 5
)
Upvotes: 1
Reputation: 29322
You can use array_count_values function
$array = array('apple', 'orange', 'pear', 'banana', 'apple',
'pear', 'kiwi', 'kiwi', 'kiwi');
print_r(array_count_values($array));
will output
Array
(
[apple] => 2
[orange] => 1
[pear] => 2
etc...
)
Upvotes: 266
Reputation: 1
$count = 0;
$output ='';
$ischeckedvalueArray = array();
for ($i=0; $i < sizeof($array); $i++) {
$eachArrayValue = $array[$i];
if(! in_array($eachArrayValue, $ischeckedvalueArray)) {
for( $j=$i; $j < sizeof($array); $j++) {
if ($array[$j] === $eachArrayValue) {
$count++;
}
}
$ischeckedvalueArray[] = $eachArrayValue;
$output .= $eachArrayValue. " Repated ". $count."<br/>";
$count = 0;
}
}
echo $output;
Upvotes: 0
Reputation:
To get rid use array_unique()
. To detect if have any use count(array_unique())
and compare to count($array)
.
Upvotes: 9
Reputation: 1
if(count(array_unique($array))<count($array))
{
// Array has duplicates
}
else
{
// Array does not have duplicates
}
Upvotes: 131
Reputation: 9618
You could try turning that array into a associative array with the fruits as keys and the number of occurrences as values. Bit long-winded, but it looks like:
$array = array('apple', 'orange', 'pear', 'banana', 'apple',
'pear', 'kiwi', 'kiwi', 'kiwi');
$new_array = array();
foreach ($array as $key => $value) {
if(isset($new_array[$value]))
$new_array[$value] += 1;
else
$new_array[$value] = 1;
}
foreach ($new_array as $fruit => $n) {
echo $fruit;
if($n > 1)
echo "($n)";
echo "<br />";
}
Upvotes: 9
Perhaps something like this (untested code but should give you an idea)?
$new = array();
foreach ($array as $value)
{
if (isset($new[$value]))
$new[$value]++;
else
$new[$value] = 1;
}
Then you'll get a new array with the values as keys and their value is the number of times they existed in the original array.
Upvotes: 2
Reputation: 115721
Stuff them into a map
(pseudocode)
map[string -> int] $m
foreach($word in $array)
{
if(!$m.contains($word))
$m[$word] = 0;
$m[$word] += 1;
}
Upvotes: 1