Cuente y muestre ocurrencias de valores únicos en una matriz

2 minutos de lectura

avatar de usuario de mikey_w
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?

Avatar de usuario de Silververstrom
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


Avatar de usuario de Anton Maryanov
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.

Avatar de usuario de Anton Gogolev
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;
}

¿Ha sido útil esta solución?