Bagaimana cara mendeteksi nilai duplikat dalam array PHP?

115

Saya bekerja dengan array satu dimensi di PHP. Saya ingin mendeteksi keberadaan nilai duplikat, lalu menghitung jumlah nilai duplikat dan mengeluarkan hasilnya. Misalnya, diberikan array berikut:

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

Saya ingin mencetak:

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

Adakah saran tentang cara mengatasi masalah ini?

Terima kasih.

Mike

mikey_w
sumber

Jawaban:

239

Anda dapat menggunakan fungsi array_count_values

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

print_r(array_count_values($array));

akan mengeluarkan

Array
(
   [apple] => 2
   [orange] => 1
   [pear] => 2
   etc...
)
Silfverstrom
sumber
1
Solusi ini tidak mencakup nilai non-integer dan non-string dan kesimpulannya menghasilkan efek samping.
codekandis
110
if(count(array_unique($array))<count($array))
{
    // Array has duplicates
}
else
{
    // Array does not have duplicates
}
Ritvick Paliwal
sumber
"... lalu hitung jumlah nilai duplikat dan keluarkan hasilnya."
showdev
Solusi ini tidak mencakup nilai non-integer dan non-string dan kesimpulannya menghasilkan efek samping. Menggunakan array_unique($array, SORT_REGULAR)memaksa PHP untuk memeriksa elemen secara normal tanpa mengubah tipenya, tetapi ini adalah perbandingan yang longgar. Jadi contoh berbeda dari satu kelas dengan konten yang sama akan menjadi unik.
codekandis
38
function array_not_unique( $a = array() )
{
  return array_diff_key( $a , array_unique( $a ) );
}
Anton Maryanov
sumber
1
Ini adalah satu-satunya jawaban yang hanya mengembalikan nilai duplikat.
Redzarf
1
Diperpanjang untuk hanya memberikan daftar nilai duplikat (apa yang saya butuhkan):return array_values(array_unique(array_diff_key($a, array_unique($a))));
Autumn Leonard
9

Anda bisa mencoba mengubah array itu menjadi array asosiatif dengan buah-buahan sebagai kunci dan jumlah kemunculan sebagai nilai. Agak bertele-tele, tetapi terlihat seperti:

$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
sumber
1
Jawaban yang bagus, tetapi PHP memiliki fungsi yang melakukan hal itu: array_count_values
Navarr
9

Untuk menghilangkan penggunaan array_unique(). Untuk mendeteksi apakah ada gunanya count(array_unique())dan bandingkan count($array).

aksu
sumber
2

Masukkan mereka ke dalam map(kodesemu)

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

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

Mungkin sesuatu seperti ini (kode belum teruji tetapi harus memberi Anda ide)?

$new = array();

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

Kemudian Anda akan mendapatkan array baru dengan nilai sebagai kunci dan nilainya adalah berapa kali nilai tersebut ada dalam array asli.


sumber
Jawaban yang bagus, tetapi PHP memiliki fungsi yang melakukan hal itu: 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
sumber
0

Saya tidak menemukan jawaban yang saya cari, jadi saya menulis fungsi ini. Ini akan membuat sebuah array yang hanya berisi duplikat antara dua array, tetapi tidak mencetak berapa kali sebuah elemen digandakan, jadi itu tidak menjawab pertanyaan secara langsung, tapi saya berharap itu akan membantu seseorang dalam situasi saya.

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

Keluaran:

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

Metode sederhana:

$array = array_values(array_unique($array, SORT_REGULAR));
kehidupan
sumber
Ini tidak menghitung nilai non-unik tetapi hanya memfilternya.
m02ph3u5