PHP dizisinde yinelenen değerler nasıl tespit edilir?


115

PHP'de tek boyutlu bir dizi ile çalışıyorum. Yinelenen değerlerin varlığını tespit etmek, ardından yinelenen değerlerin sayısını saymak ve sonuçları çıkarmak istiyorum. Örneğin, aşağıdaki dizi verildiğinde:

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

Yazdırmak istiyorum:

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

Bu soruna nasıl yaklaşılacağına dair herhangi bir tavsiye?

Teşekkürler.

mikrofon

Yanıtlar:


239

Array_count_values işlevini kullanabilirsiniz

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

print_r(array_count_values($array));

çıktı verecek

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

1
Bu çözüm, tamsayı olmayan ve dize olmayan değerleri kapsamaz ve sonuç olarak yan etkiler üretir.
codekandis

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

"... daha sonra yinelenen değerlerin sayısını sayın ve sonuçları çıkarın."
showdev

Bu çözüm, tamsayı olmayan ve dize olmayan değerleri kapsamaz ve sonuç olarak yan etkiler üretir. Kullanımı, array_unique($array, SORT_REGULAR)PHP'yi türü değiştirmeden öğeleri normal olarak denetlemeye zorlar, ancak bu gevşek bir karşılaştırma. Dolayısıyla, aynı içeriğe sahip bir sınıfın farklı örnekleri benzersiz olacaktır.
codekandis

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

1
Bu, yalnızca yinelenen değerleri döndüren tek yanıttır.
Redzarf

1
Yalnızca yinelenen değerlerin listesini verecek şekilde genişletildi (ihtiyacım olanı):return array_values(array_unique(array_diff_key($a, array_unique($a))));
Autumn Leonard

9

Bu diziyi, meyveleri anahtar olarak ve oluşum sayısını değer olarak içeren bir ilişkisel diziye dönüştürmeyi deneyebilirsiniz. Biraz uzun soluklu, ama şöyle görünüyor:

$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
İyi cevap, ancak PHP'nin tam da bunu yapan mevcut bir işlevi var:array_count_values
Navarr

9

Kurtulmak için kullanın array_unique(). Herhangi bir kullanım olup olmadığını tespit etmek count(array_unique())ve karşılaştırmak için count($array).


2

Bunları bir map(sözde kod) içine doldurun

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

    $m[$word] += 1;
}

2

Belki bunun gibi bir şey (test edilmemiş kod ama size bir fikir vermeli)?

$new = array();

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

Ardından, değerleri anahtar olarak içeren yeni bir dizi alırsınız ve bunların değeri, orijinal dizide kaç kez var olduklarıdır.


İyi cevap, ancak PHP'nin tam da bunu yapan mevcut bir işlevi var: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

Aradığım cevabı bulamadım, bu yüzden bu işlevi yazdım. Bu, yalnızca iki dizi arasındaki kopyaları içeren bir dizi oluşturacak, ancak bir öğenin kaç kez çoğaltıldığını yazdırmayacak, bu nedenle soruyu doğrudan yanıtlamıyor, ancak benim durumumdaki birine yardımcı olacağını umuyorum.

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

Çıktılar:

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

0

Basit bir yöntem:

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

Bu, benzersiz olmayan değerleri saymaz, yalnızca onları filtreler.
m02ph3u5
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.