2009-07-23 22 views
86

Estoy trabajando con una matriz unidimensional en PHP. Me gustaría detectar la presencia de valores duplicados, luego contar el número de valores duplicados y poner los resultados. Por ejemplo, dada la siguiente matriz:¿Cómo detectar valores duplicados en una matriz de PHP?

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

me gustaría imprimir:

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

Algún consejo sobre la forma de abordar este problema?

Gracias.

Mike

Respuesta

188

Puede utilizar la función array_count_values

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

print_r(array_count_values($array)); 

es la salida

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

meterlas en un (pseudo) map

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

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

Quizás algo como esto (código no probado, pero debería darle una idea)?

$new = array(); 

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

Luego le ponen una nueva matriz con los valores como claves y su valor es el número de veces que existían en la matriz original.

+0

Buena respuesta, pero PHP tiene una función existente que hace precisamente eso: [ 'array_count_values'] (http://php.net/array_count_values) – Navarr

6

Puede intentar convertir esa matriz en una matriz asociativa con las frutas como claves y el número de ocurrencias como valores. Bits de largo aliento, pero que parece:

$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

Buena respuesta, pero PHP tiene una función existente que hace precisamente eso: ['array_count_values'] (http://php.net/array_count_values) – Navarr

7

Para aprovechar al deshacerse array_unique(). Para detectar si tiene algún uso count(array_unique()) y compararlo con count($array).

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

Esta es una respuesta a la droga. – usumoio

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

"... luego cuenta el número de valores duplicados y saca los resultados". – showdev

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; 
Cuestiones relacionadas