Agora Metin2 1
Agora Metin2
lHezarfeNl 1
lHezarfeNl
mavzermete 1
mavzermete
Reklam vermek için turkmmo@gmail.com

Altın Konu PHP'de array_merge() ile Dizileri Birleştirme

image.jpeg


array_merge($a, $b) fonksiyonu, önce $a dizisinin ardından $b dizisinin elemanlarını içeren yeni bir dizi oluşturur. Bu işlem sırasında sayısal anahtarlar 0'dan başlayarak yeniden numaralandırılır. Eğer her iki dizide de aynı metin tabanlı (string) anahtar mevcutsa, sonradan gelen dizideki değer öncelikli olur ve eskisinin üzerine yazılır. Fonksiyona dilediğiniz sayıda dizi parametresi ekleyebilirsiniz.

PHP:
<?php
$fruits = ['apple', 'pear'];
$veg    = ['carrot', 'leek'];
print_r(array_merge($fruits, $veg));

$defaults = ['color' => 'blue', 'size' => 'M'];
$chosen   = ['size' => 'L'];
print_r(array_merge($defaults, $chosen));   // later value wins

array_merge() mevcut diziler üzerinde herhangi bir değişiklik yapmaz. Birleştirilmiş yeni bir dizi döndürdüğü için, elde ettiğiniz sonucu bir değişkene atamanız gerekir: $all = array_merge($all, $more);.

Sayısal Anahtarların Yeniden Numaralandırılması

array_merge() fonksiyonu, tam sayı olan anahtarları birer isim değil, konum belirteci olarak kabul eder. Bu nedenle, tam sayı anahtarlı her eleman dizinin sonuna eklenir ve mevcut anahtarlar ne olursa olsun 0'dan itibaren tekrar sıralanır. Bu davranış standart listeler için ideal olsa da, sayılar birer kimlik (ID) olarak kullanıldığında beklenmedik sonuçlar doğurabilir.

PHP:
<?php
$a = [5 => 'Ada', 9 => 'Linus'];
$b = [5 => 'Grace'];

print_r(array_merge($a, $b));   // keys 0, 1, 2: the IDs are gone

$usersById = [101 => 'Ada', 102 => 'Linus'];
$more      = [103 => 'Grace'];
print_r($usersById + $more);    // + keeps the integer keys

Tam sayıya benzeyen dizge anahtarlar ('101' gibi) sistem tarafından tam sayı olarak işlendiği için onlar da yeniden numaralandırılır. Ancak 'id101' gibi anahtarlar olduğu gibi korunur.

array_merge() ve + Operatörü Karşılaştırması

Dizileri birleştirmek için kullanılan + operatörü (dizi birleşimi) ise farklı bir mantıkla çalışır: Eğer bir anahtar soldaki dizide zaten varsa, soldaki değer korunur ve sağdaki değer yok sayılır. Ayrıca, + operatörü hiçbir zaman yeniden numaralandırma yapmaz. Bu durum, + operatörünü varsayılan değerleri tanımlamak, array_merge() fonksiyonunu ise mevcut değerleri geçersiz kılmak için daha uygun hale getirir.

PHP:
<?php
$defaults = ['theme' => 'light', 'lang' => 'en', 'per_page' => 20];
$user     = ['theme' => 'dark'];

print_r(array_merge($defaults, $user));   // user overrides defaults
print_r($user + $defaults);               // same result: user is on the left

// With lists, + compares positions and drops duplicates by key
print_r(['a', 'b'] + ['x', 'y', 'z']);

array_merge($a, $b)$a + $b
Aynı dizge anahtar$b dizisindeki değer$a dizisindeki değer
Tam sayı anahtarlaryeniden numaralanır, tüm değerler kalırkorunur, çakışmalarda $b kaybeder
Tipik kullanımlisteleri birleştirme, ayarları geçersiz kılmavarsayılanları doldurma, ID'leri koruma

Kod bloğundaki son örnek, + operatörünün klasik bir tuzağını göstermektedir: ['a', 'b'] + ['x', 'y', 'z'] işlemi sonucunda a, b, z elde edilir; çünkü 0 ve 1 indeksleri zaten sol taraftaki dizide mevcuttur.

Açma Söz Dizimi: [...a, ...b]

Açma (spread) operatörü, dizileri bir dizi tanımlamasının içerisinde parçalayarak eklemenizi sağlar. Çalışma prensibi array_merge() ile benzerdir: Sayısal anahtarlar yeniden numaralandırılır ve PHP 8.1'den itibaren dizge anahtarlara da izin verilmiş olup son gelen değer kazanır. Dizileri tekil değerlerle birlikte kullandığınızda kodun okunabilirliği artar.

PHP:
<?php
$first  = [1, 2];
$second = [3, 4];

print_r([...$first, ...$second, 5]);

$base  = ['host' => 'localhost', 'port' => 3306];
$local = ['port' => 3307];
print_r([...$base, ...$local]);

Bir diziyi mevcut başka bir diziye doğrudan eklemek isterseniz, array_push() fonksiyonu ile açma operatörünün kullanımına bakabilirsiniz.

Dizilerden Oluşan Bir Diziyi Birleştirme

Birleştirilecek diziler bir listenin içerisindeyse, bu listeyi array_merge() fonksiyonuna açma operatörüyle aktarabilirsiniz. Bu yöntem aynı zamanda döngüler içerisinde birleştirme yapmanın en verimli yoludur: Önce tüm parçaları toplayıp, ardından tek seferde birleştirme işlemini gerçekleştirebilirsiniz.

PHP:
<?php
$pages = [
    ['ada', 'linus'],
    ['grace'],
    ['margaret', 'alan'],
];

$all = array_merge(...$pages);
print_r($all);

$batches = [];
for ($page = 1; $page <= 3; $page++) {
    $batches[] = range($page * 10, $page * 10 + 2);   // pretend API page
}
echo implode(', ', array_merge(...$batches)), "\n";

var_dump(array_merge(...[]));   // an empty list gives []

Bir döngü içerisinde $all = array_merge($all, $batch); şeklinde bir kullanım teknik olarak çalışsa da, her adımda büyüyen dizinin tamamını yeniden kopyaladığı için binlerce elemanla çalışırken performans kaybına yol açar.

array_merge_recursive() ve array_replace()

array_merge_recursive() fonksiyonu, iç içe geçmiş dizileri de birleştirir. Ancak aynı dizge anahtarına sahip düz değerlerle karşılaştığında üzerine yazmak yerine, her iki değeri yeni bir dizide toplar. Yapılandırma ayarları için bu durum genellikle istenmez; bu senaryolarda en doğru araç array_replace_recursive() fonksiyonudur. Bu fonksiyon, her seviyede değerlerin üzerine yazar ve anahtarları korur.

PHP:
<?php
$defaults = ['db' => ['host' => 'localhost', 'port' => 3306], 'debug' => false];
$override = ['db' => ['port' => 3307], 'debug' => true];

echo json_encode(array_merge($defaults, $override)), "\n";
echo json_encode(array_merge_recursive($defaults, $override)), "\n";
echo json_encode(array_replace_recursive($defaults, $override)), "\n";

print_r(array_replace([5 => 'a', 9 => 'b'], [9 => 'B']));   // keeps integer keys

Kod örneğindeki üç JSON çıktısını incelediğinizde şunlar görülür: array_merge() tüm db dizisini değiştirmiş ve host bilgisini silmiştir; array_merge_recursive() ise port ve debug değerlerini iki elemanlı listelere dönüştürmüştür. Arzu edilen yapılandırma sonucunu ise array_replace_recursive() vermiştir.

Sık Yapılan Hata: Birleştirme İşlemi Tekrarları Silmez

array_merge() fonksiyonu, farklı anahtarlar altında bulunan aynı değerleri korur. Örneğin, iki farklı etiket listesini birleştirdiğinizde, ortak olan her etiket sonuçta iki kez yer alır. Bu durumu önlemek için sonucu önce array_unique() fonksiyonundan geçirip, ardından indeksleri düzeltmek için array_values() ile yeniden sıralamalısınız.

PHP:
<?php
$postTags  = ['php', 'arrays', 'beginner'];
$extraTags = ['arrays', 'tutorial', 'php'];

$merged = array_merge($postTags, $extraTags);
echo implode(', ', $merged), "\n";

$unique = array_values(array_unique($merged));
echo implode(', ', $unique), "\n";

array_unique() sayfası, satırlardan ve iç içe dizilerden tekrarlayan verilerin nasıl temizleneceğini detaylandırmaktadır.
 

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

Geri
Üst