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

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

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
}

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

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

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


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

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.


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;

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
)

0

Metode sederhana:

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

Ini tidak menghitung nilai non-unik tetapi hanya memfilternya.
m02ph3u5
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.