array_unique($array) fonksiyonu, bir dizi içerisindeki yinelenen elemanları temizleyerek sonucu döndürür. Bu işlem sırasında her değerin ilk karşılaşılan hali orijinal anahtarıyla korunurken, sonraki kopyalar diziden çıkarılır.
PHP:
<?php
$tags = ["php", "arrays", "php", "tips", "arrays", "php"];
$unique = array_unique($tags);
print_r($unique);
print_r(array_values($unique)); // renumbered 0, 1, 2
Kodu çalıştırdığınızda, her değerin ilk göründüğü konumlar olduğu için
0, 1, 3 gibi anahtarlar kalır. Eğer json_encode gibi işlemlerden önce ardışık ve temiz bir liste elde etmek isterseniz, fonksiyonu array_values() ile sarmalayabilirsiniz.array_unique() Fonksiyonu Eşitliği Nasıl Belirler?
Varsayılan çalışma prensibine göre, tüm değerler önce dizgeye (string) dönüştürülür ve ardından karşılaştırılır. Bu nedenle
1, "1" ve 1.0 aynı kabul edilir ve ilk rastlanan değer korunur. Karşılaştırma yöntemini değiştirmek için ikinci parametreyi kullanabilirsiniz.
PHP:
<?php
$mixed = [1, "1", 1.0, true, "01", 2];
var_dump(array_unique($mixed)); // compared as strings
var_dump(array_unique($mixed, SORT_REGULAR)); // compared with ==
var_dump(array_unique(["10", "1e1", "010"], SORT_NUMERIC));
| Bayrak | İki değer şu durumda tekrardır |
|---|---|
SORT_STRING (varsayılan) | (string) $a === (string) $b |
SORT_REGULAR | $a == $b |
SORT_NUMERIC | sayı olarak eşitlerse |
Varsayılan ayarlarda
"01" değeri korunur, zira "01" ile "1" farklı dizgelerdir. Ancak SORT_REGULAR kullanıldığında "01" == 1 ifadesi doğru (true) olduğu için bu değer elenir. Ayrıca gevşek karşılaştırma, true boolean değerinin içi dolu herhangi bir değerle eşleşmesine yol açabilir. Karışık veri tipleriyle çalışırken sonucu kontrol etmeniz önerilir; detaylı kurallar karşılaştırma operatörleri bölümünde yer almaktadır.Büyük/Küçük Harf Ayrımını Devre Dışı Bırakarak Temizleme
array_unique fonksiyonu büyük ve küçük harflere duyarlıdır; dolayısıyla "PHP" ile "php" farklı elemanlar olarak görülür. Eğer bu farkı yok sayıp ilk yazım şeklini korumak istiyorsanız, önce dizinin küçük harfe çevrilmiş bir kopyasını oluşturup benzersiz anahtarları belirleyebilir, ardından bu anahtarları orijinal diziden çekebilirsiniz.
PHP:
<?php
$languages = ["PHP", "Python", "php", "Go", "python", "GO", "Rust"];
$keys = array_unique(array_map('strtolower', $languages));
$result = array_values(array_intersect_key($languages, $keys));
print_r($result);
Bu yöntemde
array_map ile aynı anahtarlara sahip küçük harfli bir kopya üretilir, array_unique ile ilk rastlananların anahtarları tespit edilir ve array_intersect_key aracılığıyla bu anahtarlar orijinal diziden seçilir. Japonca veya aksanlı karakterler içeren metinler için strtolower yerine mb_strtolower tercih edilmelidir.Çok Boyutlu Dizilerde array_unique Kullanımı
Parametresiz kullanımda
array_unique, her bir alt diziyi "Array" şeklinde bir dizgeye dönüştürür. Bu durum tüm satırların aynı görünmesine neden olur ve "Array to string conversion" uyarısı eşliğinde sadece ilk satır kalır. Satırların tamamını karşılaştırmak için SORT_REGULAR parametresi eklenmelidir. Belirli bir sütundaki değerlere göre tekilleştirme yapmak istiyorsanız, null ve bir indeks anahtarı ile array_column kullanmak çok daha pratiktir.
PHP:
<?php
$signups = [
["email" => "ada@example.com", "plan" => "free"],
["email" => "bob@example.com", "plan" => "pro"],
["email" => "ada@example.com", "plan" => "free"],
["email" => "ada@example.com", "plan" => "pro"],
];
// Exact duplicate rows removed
print_r(array_unique($signups, SORT_REGULAR));
// One row per email: the last row for each email wins
print_r(array_values(array_column($signups, null, 'email')));
İkinci yöntem, her e-posta adresi için en son satırı saklar çünkü sonraki kayıtlar aynı anahtar altında öncekilerin üzerine yazılır. İndeks anahtarının detaylarını
array_column sayfasında bulabilirsiniz.Tekrarların Tespiti ve Sayılması
array_count_values() fonksiyonu, her bir değerin kaç kez tekrarlandığını döndürür. Sonucu 1'den büyük olanlar için filtrelediğinizde, yalnızca tekrarlanan değerlere ulaşırsınız.
PHP:
<?php
$votes = ["red", "blue", "red", "green", "blue", "red"];
$counts = array_count_values($votes);
print_r($counts);
$duplicates = array_keys(array_filter($counts, fn($n) => $n > 1));
echo "Duplicated: " . implode(", ", $duplicates) . "\n";
echo count($votes) === count(array_unique($votes))
? "No duplicates\n"
: "Has duplicates\n";
Son örnekte, bir dizide herhangi bir tekrar olup olmadığını kontrol eden yaygın bir tek satırlık yöntem gösterilmiştir.
Geniş Veri Setleri İçin Performanslı Yöntemler
array_unique karşılaştırma yapmadan önce her elemanı dizgeye çevirir; bu durum binlerce veri için sorun olmasa da çok daha büyük listelerde yavaşlığa neden olabilir. Büyük tam sayı veya dizge listeleri için diziyi ters çevirmek (flip) daha hızlı bir çözümdür: böylece değerler anahtar konumuna geçer ve anahtarlar doğası gereği benzersizdir.
PHP:
<?php
$ids = [];
for ($i = 0; $i < 200000; $i++) {
$ids[] = $i % 1000;
}
$start = hrtime(true);
$a = array_unique($ids);
$t1 = (hrtime(true) - $start) / 1e6;
$start = hrtime(true);
$b = array_keys(array_flip($ids));
$t2 = (hrtime(true) - $start) / 1e6;
echo count($a), " unique values with array_unique\n";
echo count($b), " unique values with array_keys(array_flip())\n";
printf("array_unique: %.1f ms, array_flip: %.1f ms\n", $t1, $t2);
Çalışma süreleri ortamdan ortama farklılık gösterse de, ters çevirme yöntemi genellikle birkaç kat daha hızlı sonuç verir. Bu yöntem sadece dizi anahtarı olmaya uygun değerlerle (tam sayılar ve dizgeler) çalışır ve
"5" gibi sayısal dizgeler tam sayıya dönüştürülerek geri döner.