Come rilevare i valori duplicati nell'array PHP?


115

Sto lavorando con un array unidimensionale in PHP. Vorrei rilevare la presenza di valori duplicati, quindi contare il numero di valori duplicati e visualizzare i risultati. Ad esempio, dato il seguente array:

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

Vorrei stampare:

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

Qualche consiglio su come affrontare questo problema?

Grazie.

Mike

Risposte:


239

È possibile utilizzare la funzione array_count_values

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

print_r(array_count_values($array));

verrà prodotto

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

1
Questa soluzione non copre alcun valore non intero e non stringa e in conclusione produce effetti collaterali.
codekandis

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

"... quindi conta il numero di valori duplicati e mostra i risultati."
showdev

Questa soluzione non copre alcun valore non intero e non stringa e in conclusione produce effetti collaterali. L'uso di array_unique($array, SORT_REGULAR)PHP forza il controllo degli elementi normalmente senza cambiare il tipo, ma è un confronto approssimativo. Quindi istanze diverse di una classe con lo stesso contenuto saranno unificate.
codekandis

38
function array_not_unique( $a = array() )
{
  return array_diff_key( $a , array_unique( $a ) );
}

1
Questa è l'unica risposta che restituisce solo i valori duplicati.
Redzarf

1
Esteso per fornire solo un elenco di valori duplicati (quello di cui avevo bisogno):return array_values(array_unique(array_diff_key($a, array_unique($a))));
Autumn Leonard

9

Potresti provare a trasformare quell'array in un array associativo con i frutti come chiavi e il numero di occorrenze come valori. Un po 'prolisso, ma sembra:

$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
Buona risposta, ma PHP ha una funzione esistente che fa proprio questo: array_count_values
Navarr

9

Per sbarazzarsi di usare array_unique(). Per rilevare se ha qualche utilità count(array_unique())e confrontare con count($array).


2

Inseriscili in uno map(pseudocodice)

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

    $m[$word] += 1;
}

2

Forse qualcosa del genere (codice non testato ma dovrebbe darti un'idea)?

$new = array();

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

Quindi otterrai un nuovo array con i valori come chiavi e il loro valore è il numero di volte in cui sono esistiti nell'array originale.


Buona risposta, ma PHP ha una funzione esistente che fa proprio questo: array_count_values
Navarr

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;

0

Non ho trovato la risposta che stavo cercando, quindi ho scritto questa funzione. Questo creerà un array che contiene solo i duplicati tra i due array, ma non stamperà il numero di volte in cui un elemento viene duplicato, quindi non risponde direttamente alla domanda, ma spero che possa aiutare qualcuno nella mia situazione.

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);

Uscite:

Array
(
    [0] => 4
    [1] => 5
)

0

Un metodo semplice:

$array = array_values(array_unique($array, SORT_REGULAR));

Questo non conta i valori non univoci ma li filtra.
m02ph3u5
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.