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
SilentGhost
293k64 gold badges301 silver badges291 bronze badges
asked Jul 23, 2009 at 10:11
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... )
Gagantous
3506 gold badges26 silver badges62 bronze badges
answered Jul 23, 2009 at 10:14
SilfverstromSilfverstrom
27.1k6 gold badges44 silver badges56 bronze badges
1
if(count(array_unique($array))<count($array)) { // Array has duplicates } else { // Array does not have duplicates }
2
function array_not_unique( $a = array() ) { return array_diff_key( $a , array_unique( $a ) ); }
sth
215k50 gold badges273 silver badges363 bronze badges
answered Oct 22, 2009 at 18:50
3
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 />"; }answered Jul 23, 2009 at 10:36
Simon ScarfeSimon Scarfe
9,1404 gold badges27 silver badges32 bronze badges
1
To get rid use array_unique(). To detect if have any use count(array_unique()) and compare to count($array).
aksu
5,1815 gold badges23 silver badges39 bronze badges
answered Aug 20, 2009 at 15:04
Stuff them into a map (pseudocode)
map[string -> int] $m foreach($word in $array) { if(!$m.contains($word)) $m[$word] = 0; $m[$word] += 1; }answered Jul 23, 2009 at 10:15
Anton GogolevAnton Gogolev
111k38 gold badges194 silver badges282 bronze badges
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.
answered Jul 23, 2009 at 10:17
1
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 )answered Mar 15, 2018 at 20:02
aswineaswine
16011 bronze badges
$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.
answered Sep 10, 2021 at 11:17
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]; }
answered Oct 7, 2021 at 12:02
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']answered Apr 18 at 8:31
SaifSaif
291 silver badge5 bronze badges
$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;
Tunaki
128k45 gold badges322 silver badges405 bronze badges
answered Apr 16, 2016 at 18:47
A simple method:
$array = array_values(array_unique($array, SORT_REGULAR));
biruk1230
2,8834 gold badges15 silver badges28 bronze badges
answered Jan 28, 2020 at 13:39
1