mavzermete 1
mavzermete
kaptanmikro1 1
kaptanmikro1
Jack.Wrestler 1
Jack.Wrestler
TuZaKK 1
TuZaKK
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Agora Metin2 1
Agora Metin2
EnesDeniz™ 1
EnesDeniz™
Cancan.1234 1
Cancan.1234
lHezarfeNl 1
lHezarfeNl
Bodyguardd 1
Bodyguardd
kralhakan2009 1
kralhakan2009
Reklam vermek için turkmmo@gmail.com

PHP'de array_unique() ile Tekrar Eden Verileri Temizleme

  • Konuyu başlatan Konuyu başlatan Agora Metin2
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 8
image.jpeg


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_NUMERICsayı 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.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst