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

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

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
}

„... 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 ) );
}

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 />";
}

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


2

Wrzuć je do map(pseudokod)

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

    $m[$word] += 1;
}

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.


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;

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
)

0

Prosta metoda:

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

Nie liczy to nieunikalnych wartości, a jedynie je filtruje.
m02ph3u5
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.