2009-07-23 23 views
86

我正在使用PHP中的一维数组。我想检测重复值的存在,然后统计重复值的数量并输出结果。例如,假设下面的数组:如何检测PHP数组中的重复值?

$array = array('apple', 'orange', 'pear', 'banana', 'apple', 
    'pear', 'kiwi', 'kiwi', 'kiwi'); 

我想打印:

apple (2) 
orange 
pear (2) 
banana 
kiwi (3) 

对如何处理这个问题有什么建议?

谢谢。

迈克

回答

188

可以使用array_count_values功能

$array = array('apple', 'orange', 'pear', 'banana', 'apple', 
'pear', 'kiwi', 'kiwi', 'kiwi'); 

print_r(array_count_values($array)); 

将输出

Array 
(
    [apple] => 2 
    [orange] => 1 
    [pear] => 2 
    etc... 
) 
2

地把它们塞进一个map(伪)

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

    $m[$word] += 1; 
} 
2

也许这样的事情(未经测试的代码,但应该给你一个想法)?

$new = array(); 

foreach ($array as $value) 
{ 
    if (isset($new[$value])) 
     $new[$value]++; 
    else 
     $new[$value] = 1; 
} 

然后你会得到一个新的数组作为键的值,它们的值是它们在原始数组中存在的次数。

+0

很好的回答,但PHP有一个现有的功能做到了这一点:[`array_count_values`(http://php.net/array_count_values) – Navarr 2016-01-27 16:04:53

6

您可以尝试将该数组转换为关联数组,其中水果作为关键字,出现次数作为值。位长啰嗦,但它看起来像:

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

很好的回答,但PHP有一个现有的功能,只是这样做:[`array_count_values`](http://php.net/array_count_values) – Navarr 2016-01-27 16:04:26

7

摆脱使用array_unique()。检测是否有任何用处count(array_unique())并与count($array)比较。

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

这是一个解决方案的答案。 “ – usumoio 2016-07-29 18:52:10

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

”...然后计算重复值的数量并将结果输出。“ – showdev 2018-03-09 01:31:12

3
<?php 

$arr = array(1, 2, 3, 2, 5, 6, 7); 

print_r(array_count_values($arr)); 

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