Jak wykryć zduplikowane wartości w tablicy PHP?

115

Pracuję z jednowymiarową tablicą w PHP. Chciałbym wykryć obecność zduplikowanych wartości, a następnie policzyć liczbę zduplikowanych wartości i opublikować wyniki. Na przykład biorąc pod uwagę następującą tablicę:

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

Chciałbym wydrukować:

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

Jakieś rady, jak podejść do tego problemu?

Dzięki.

Mikrofon

mikey_w
źródło

Odpowiedzi:

239

Możesz użyć funkcji array_count_values

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

print_r(array_count_values($array));

wyjdzie

Array
(
   [apple] => 2
   [orange] => 1
   [pear] => 2
   etc...
)
Silfverstrom
źródło
1
To rozwiązanie nie obejmuje żadnych wartości niebędących liczbami całkowitymi ani łańcuchami, a podsumowując, daje efekty uboczne.
codekandis
110
if(count(array_unique($array))<count($array))
{
    // Array has duplicates
}
else
{
    // Array does not have duplicates
}
Ritvick Paliwal
źródło
„... następnie policz liczbę zduplikowanych wartości i wyślij wyniki”.
showdev
To rozwiązanie nie obejmuje żadnych wartości niebędących liczbami całkowitymi ani łańcuchami, a podsumowując, daje efekty uboczne. Użycie array_unique($array, SORT_REGULAR)wymusza na PHP normalne sprawdzanie elementów bez zmiany typu, ale jest to luźne porównanie. Tak więc różne wystąpienia jednej klasy o tej samej zawartości będą unikalne.
codekandis
38
function array_not_unique( $a = array() )
{
  return array_diff_key( $a , array_unique( $a ) );
}
Anton Maryanov
źródło
1
To jedyna odpowiedź, która zwraca tylko zduplikowane wartości.
Redzarf
1
Rozszerzony, aby podać tylko listę zduplikowanych wartości (czego potrzebowałem):return array_values(array_unique(array_diff_key($a, array_unique($a))));
Autumn Leonard
9

Możesz spróbować przekształcić tę tablicę w tablicę asocjacyjną z owocami jako kluczami i liczbą wystąpień jako wartościami. Trochę rozwlekły, ale wygląda na to:

$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 />";
}
Simon Scarfe
źródło
1
Dobra odpowiedź, ale PHP ma istniejącą funkcję, która właśnie to robi: array_count_values
Navarr
9

Aby się pozbyć użyj array_unique(). Aby wykryć, czy mają jakieś zastosowanie count(array_unique())i porównać z count($array).

aksu
źródło
2

Wrzuć je do map(pseudokod)

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

    $m[$word] += 1;
}
Anton Gogolev
źródło
2

Może coś takiego (nieprzetestowany kod, ale powinien dać ci pomysł)?

$new = array();

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

Następnie otrzymasz nową tablicę z wartościami jako kluczami, a ich wartością jest liczba przypadków, w których istniały one w oryginalnej tablicy.


źródło
Dobra odpowiedź, ale PHP ma istniejącą funkcję, która właśnie to robi: 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;
uday
źródło
0

Nie znalazłem odpowiedzi, której szukałem, więc napisałem tę funkcję. Spowoduje to utworzenie tablicy, która będzie zawierała tylko duplikaty między dwiema tablicami, ale nie wypisze liczby duplikatów elementu, więc nie jest to bezpośrednia odpowiedź na pytanie, ale mam nadzieję, że pomoże to komuś w mojej sytuacji.

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

Wyjścia:

Array
(
    [0] => 4
    [1] => 5
)
aswine
źródło
0

Prosta metoda:

$array = array_values(array_unique($array, SORT_REGULAR));
życie
źródło
Nie liczy to nieunikalnych wartości, a jedynie je filtruje.
m02ph3u5