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

mikey_w
quelle

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...
)
Silfverstrom
quelle
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
}
Ritvick Paliwal
quelle
"... 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 ) );
}
Anton Maryanov
quelle
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).

aksu
quelle
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 />";
}
Simon Scarfe
quelle
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;
}
Anton Gogolev
quelle
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.


quelle
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;
uday
quelle
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
)
aswine
quelle
0

Eine einfache Methode:

$array = array_values(array_unique($array, SORT_REGULAR));
das Leben
quelle
Dies zählt keine nicht eindeutigen Werte, sondern filtert sie nur.
m02ph3u5