Wie erkennt man doppelte Werte im PHP-Array?


114

Ich arbeite mit einem eindimensionalen Array in PHP. Ich möchte das Vorhandensein doppelter Werte erkennen, dann die Anzahl doppelter Werte zählen und die Ergebnisse ausgeben. Zum Beispiel bei folgendem Array:

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

Ich möchte drucken:

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

Irgendwelche Ratschläge, wie man dieses Problem angeht?

Vielen Dank.

Mike

Antworten:


239

Sie können die Funktion array_count_values verwenden

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

print_r(array_count_values($array));

wird ausgegeben

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

1
Diese Lösung deckt keine Nicht-Integer- und Nicht-String-Werte ab und führt zu Nebenwirkungen.
Codekandis

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

"... dann zähle die Anzahl der doppelten Werte und gib die Ergebnisse aus."
Showdev

Diese Lösung deckt keine Nicht-Ganzzahl- und Nicht-Zeichenfolgenwerte ab und führt zu Nebenwirkungen. Die Verwendung array_unique($array, SORT_REGULAR)erzwingt PHP, um Elemente normal zu überprüfen, ohne den Typ zu ändern, aber es ist ein loser Vergleich. So werden verschiedene Instanzen einer Klasse mit demselben Inhalt eindeutig.
Codekandis

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

1
Dies ist die einzige Antwort, die nur die doppelten Werte zurückgibt.
Redzarf

1
Erweitert, um nur eine Liste von doppelten Werten zu geben (was ich brauchte):return array_values(array_unique(array_diff_key($a, array_unique($a))));
Herbst Leonard

9

Um loszuwerden array_unique(). Um festzustellen, ob es von Nutzen ist, count(array_unique())und um es zu vergleichen count($array).


8

Sie können versuchen, dieses Array in ein assoziatives Array mit den Früchten als Schlüssel und der Anzahl der Vorkommen als Werte umzuwandeln. Etwas langatmig, aber es sieht aus wie:

$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
Gute Antwort, aber PHP hat eine existierende Funktion, die genau das tut: array_count_values
Navarr

2

Füllen Sie sie in einen map(Pseudocode)

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

    $m[$word] += 1;
}

2

Vielleicht so etwas (ungetesteter Code, sollte Ihnen aber eine Idee geben)?

$new = array();

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

Dann erhalten Sie ein neues Array mit den Werten als Schlüssel und deren Wert gibt an, wie oft sie im ursprünglichen Array vorhanden waren.


Gute Antwort, aber PHP hat eine existierende Funktion, die genau das tut: 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

Ich habe die gesuchte Antwort nicht gefunden und diese Funktion geschrieben. Dadurch wird ein Array erstellt, das nur die Duplikate zwischen den beiden Arrays enthält, aber nicht so oft druckt, wie ein Element dupliziert wird. Daher wird die Frage nicht direkt beantwortet, aber ich hoffe, dass es jemandem in meiner Situation hilft.

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

Ausgänge:

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

0

Eine einfache Methode:

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

Dies zählt keine nicht eindeutigen Werte, sondern filtert sie nur.
m02ph3u5
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.