webentwicklung-frage-antwort-db.com.de

So ermitteln Sie doppelte Werte in PHP Array?

Ich arbeite mit einem eindimensionalen Array in PHP. Ich möchte das Vorhandensein doppelter Werte feststellen, dann die Anzahl der doppelten Werte zählen und die Ergebnisse ausgeben. Geben Sie beispielsweise das folgende Array an:

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

Ich möchte drucken:

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

Ratschläge, wie Sie dieses Problem angehen können?

Vielen Dank.

Mike

97
mikey_w

Sie können array_count_values ​​ function 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...
)
210
Silfverstrom
if(count(array_unique($array))<count($array))
{
    // Array has duplicates
}
else
{
    // Array does not have duplicates
}
99
Ritvick Paliwal
function array_not_unique( $a = array() )
{
  return array_diff_key( $a , array_unique( $a ) );
}
30
Anton Maryanov

Um loszuwerden, benutze array_unique(). Um herauszufinden, ob Sie count(array_unique()) verwenden, und vergleichen Sie sie mit count($array).

8
helpful tip

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

$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 />";
}
6
Simon Scarfe
<?php

$arr = array(1, 2, 3, 2, 5, 6, 7);

print_r(array_count_values($arr));

?>
3
tarun

Fülle sie in eine map (Pseudocode)

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

    $m[$Word] += 1;
}
2
Anton Gogolev

Vielleicht so etwas (ungeprüfter Code, aber sollte Ihnen 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. Ihr Wert gibt an, wie oft sie im ursprünglichen Array vorhanden waren.

2
$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
uday

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

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
aswine