mikey_w
Estoy trabajando con una matriz unidimensional en PHP. Me gustaría detectar la presencia de valores duplicados, luego contar la cantidad de valores duplicados y generar los resultados. Por ejemplo, dada la siguiente matriz:
$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 cómo abordar este problema?
Silfverstrom
Puedes usar array_count_values función
$array = array('apple', 'orange', 'pear', 'banana', 'apple',
'pear', 'kiwi', 'kiwi', 'kiwi');
print_r(array_count_values($array));
dará salida
Array
(
[apple] => 2
[orange] => 1
[pear] => 2
etc...
)
-
Esta solución no cubre ningún valor que no sea entero ni cadena y, en conclusión, produce efectos secundarios.
– códigokandis
29 de mayo de 2018 a las 12:18
if(count(array_unique($array))<count($array))
{
// Array has duplicates
}
else
{
// Array does not have duplicates
}
-
“…entonces cuenta el número de valores duplicados y saca los resultados”.
– showdev
9 de marzo de 2018 a las 1:31
-
Esta solución no cubre ningún valor que no sea entero ni cadena y, en conclusión, produce efectos secundarios. Usando
array_unique($array, SORT_REGULAR)
obliga a PHP a verificar los elementos normalmente sin cambiar el tipo, pero es una comparación vaga. Por lo tanto, las diferentes instancias de una clase con el mismo contenido serán únicas.– códigokandis
29 de mayo de 2018 a las 12:33
Antón Maríanov
function array_not_unique( $a = array() )
{
return array_diff_key( $a , array_unique( $a ) );
}
Resultado: (Manifestación)
array (
4 => 'apple',
5 => 'pear',
7 => 'kiwi',
8 => 'kiwi',
)
-
Esta es la única respuesta que devuelve solo los valores duplicados.
– Redzarf
11 de enero de 2019 a las 18:45
-
Extendido para dar solo una lista de valores duplicados (lo que necesitaba):
return array_values(array_unique(array_diff_key($a, array_unique($a))));
– Otoño Leonardo
15 de febrero de 2019 a las 19:42
Podría intentar convertir esa matriz en una matriz asociativa con las frutas como claves y el número de ocurrencias como valores. Un poco largo, pero 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 />";
}
Para deshacerse de usar array_unique()
. Para detectar si tiene alguna utilidad count(array_unique())
y comparar con count($array)
.
¿Quizás algo como esto (código no probado pero debería darte una idea)?
$new = array();
foreach ($array as $value)
{
if (isset($new[$value]))
$new[$value]++;
else
$new[$value] = 1;
}
Luego obtendrá una nueva matriz con los valores como claves y su valor es la cantidad de veces que existieron en la matriz original.
Antón Gogolev
Rellenarlos en un map
(pseudocódigo)
map[string -> int] $m
foreach($word in $array)
{
if(!$m.contains($word))
$m[$word] = 0;
$m[$word] += 1;
}