How to detect duplicate values in PHP array?

PhpArrays

Php Problem Overview


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 out put the results. For example, given the following array:

$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?

Thanks.

Mike

Php Solutions


Solution 1 - Php

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...
)

Solution 2 - Php

if(count(array_unique($array))<count($array))
{
    // Array has duplicates
}
else
{
    // Array does not have duplicates
}

Solution 3 - Php

function array_not_unique( $a = array() )
{
  return array_diff_key( $a , array_unique( $a ) );
}

Solution 4 - Php

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 />";
}

Solution 5 - Php

To get rid use array_unique(). To detect if have any use count(array_unique()) and compare to count($array).

Solution 6 - Php

Stuff them into a map (pseudocode)

map[string -> int] $m
foreach($word in $array)
{
    if(!$m.contains($word))
        $m[$word] = 0;
    
    $m[$word] += 1;
}
        

Solution 7 - Php

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.

Solution 8 - Php

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
)

Solution 9 - Php

$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.

Solution 10 - Php

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

Solution 11 - Php

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

Solution 12 - Php

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'] 

Solution 13 - Php

A simple method:

$array = array_values(array_unique($array, SORT_REGULAR));

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionmikey_wView Question on Stackoverflow
Solution 1 - PhpSilfverstromView Answer on Stackoverflow
Solution 2 - PhpRitvick PaliwalView Answer on Stackoverflow
Solution 3 - PhpAnton MaryanovView Answer on Stackoverflow
Solution 4 - PhpSimon ScarfeView Answer on Stackoverflow
Solution 5 - Phphelpful tipView Answer on Stackoverflow
Solution 6 - PhpAnton GogolevView Answer on Stackoverflow
Solution 7 - PhpView Answer on Stackoverflow
Solution 8 - PhpaswineView Answer on Stackoverflow
Solution 9 - PhpSantiago BrotView Answer on Stackoverflow
Solution 10 - PhpRupessView Answer on Stackoverflow
Solution 11 - PhpudayView Answer on Stackoverflow
Solution 12 - PhpSaifView Answer on Stackoverflow
Solution 13 - PhpthelifeView Answer on Stackoverflow