lHezarfeNl 1
lHezarfeNl
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
Reklam vermek için turkmmo@gmail.com

Altın Konu PHP Dizilerinden Eleman Çıkarma: unset ve array_splice Kullanımı

image.jpeg


PHP'de bir dizideki belirli bir elemanı anahtarı aracılığıyla silmek için unset($array[$key]) fonksiyonundan yararlanabilirsiniz. Bu işlem sonucunda ilgili eleman kaldırılırken diğer anahtarlar mevcut hallerini korur. Ayrıca, dizide mevcut olmayan bir anahtar üzerinde unset işlemi yapmak herhangi bir hataya yol açmaz.

PHP:
<?php
$user = ["name" => "Ada", "email" => "ada@example.com", "password" => "secret"];

unset($user["password"]);
print_r($user);

$colors = ["red", "green", "blue", "yellow"];
unset($colors[1]);
print_r($colors);

Kod çalıştırıldığında elde edilen ikinci sonuca bakarsanız, anahtarların 0, 2, 3 şeklinde kaldığını görebilirsiniz. Bu durum, unset fonksiyonunun dizideki indeksleri yeniden düzenlemediğini kanıtlar.

unset İşlemi Sonrası Diziyi Yeniden İndeksleme

Anahtarlar arasında boşlukların oluşması, ilerleyen aşamalarda bazı sorunlara neden olabilir. Örneğin, for ($i = 0; ...) şeklinde kurulan bir döngü eksik indekse ulaştığında hata verebilir veya json_encode fonksiyonu diziyi bir JSON dizisi yerine JSON nesnesi olarak çıktılayabilir. Bu sorunları gidermek ve temiz bir anahtar sıralaması elde etmek için array_values() fonksiyonu kullanılabilir.

PHP:
<?php
$colors = ["red", "green", "blue", "yellow"];
unset($colors[1]);

echo json_encode($colors), "\n";

$colors = array_values($colors);
echo json_encode($colors), "\n";

array_splice ile Konum Bazlı Silme İşlemi

array_splice($array, $offset, $length) fonksiyonu, $offset ile belirtilen konumdan başlayarak $length miktarı kadar elemanı diziden çıkarır. Bu fonksiyonun unset'den temel farkı, silme işleminden sonra anahtarları otomatik olarak yeniden numaralandırmasıdır. Ayrıca silinen öğeleri bir dizi şeklinde döndürür. Eğer başlangıç değeri (offset) negatif girilirse, işlem dizinin sonundan geriye doğru sayarak başlar. Aynı komutla silme işlemi yapılırken diziye yeni elemanlar eklemek de mümkündür.

PHP:
<?php
$queue = ["a", "b", "c", "d", "e"];

$removed = array_splice($queue, 1, 2);
print_r($removed);
print_r($queue);

// Remove the second to last element
array_splice($queue, -2, 1);
print_r($queue);

// Replace one element with two
$letters = ["x", "y", "z"];
array_splice($letters, 1, 1, ["Y1", "Y2"]);
print_r($letters);

array_splice anahtarlarla değil, elemanların konumlarıyla çalışır. İlişkisel dizilerde elemanı sırasına göre siler ancak dizge (string) anahtarlarını korur. Orijinal diziyi değiştirmeden sadece belirli bir bölümün kopyasını alan array_slice fonksiyonu ile arasındaki fark budur.

Belirli Bir Değere Göre Eleman Silme

Bir dizideki $value değerine eşit olan tüm elemanları çıkarmak için array_diff($array, [$value]) kullanılabilir. Bu işlem, eşleşen değerleri silerken mevcut anahtarları sabit tutar. Eğer amacınız sadece ilk eşleşen elemanı silmekse, önce array_search ile ilgili anahtarı bulmalı, ardından unset ile kaldırmalısınız.

PHP:
<?php
$tags = ["php", "draft", "arrays", "draft", "tips"];

// Every "draft"
print_r(array_diff($tags, ["draft"]));

// Several values at once
print_r(array_values(array_diff($tags, ["draft", "tips"])));

// Only the first "draft"
$key = array_search("draft", $tags);
if ($key !== false) {
    unset($tags[$key]);
}
print_r($tags);

array_diff fonksiyonu karşılaştırmaları dizge (string) tipinde yapar. Bu nedenle array_diff([1, "1", 2], [1]) işlemi yapıldığında hem tam sayı olan 1 hem de metin olan "1" silinir. Eğer silme koşulunuz "değer eşitliği"nden daha karmaşıksa, bir geri çağırma fonksiyonuyla birlikte array_filter kullanmanız daha sağlıklı olacaktır.

Dizinin İlk veya Son Elemanını Kaldırma

Dizinin en başındaki elemanı silmek için array_shift(), en sonundaki elemanı silmek için ise array_pop() fonksiyonları kullanılır. Her iki fonksiyon da sildikleri elemanı geri döndürdüğü için yığın ve kuyruk veri yapılarının oluşturulmasında oldukça kullanışlıdırlar.

PHP:
<?php
$tasks = ["write", "test", "deploy"];

$first = array_shift($tasks);
$last = array_pop($tasks);

echo "First: $first\n";
echo "Last: $last\n";
print_r($tasks);

array_shift işlemi, sayısal anahtarları 0'dan başlayacak şekilde yeniden düzenler. Ancak array_pop işleminde boşluk dizinin sonunda oluştuğu için böyle bir yeniden numaralandırmaya ihtiyaç duyulmaz.

Çoklu Anahtar Silme İşlemleri

unset fonksiyonu tek bir çağrıda birden fazla eleman silmenize olanak tanır. Eğer silinecek anahtarları bir dizi içerisinde tutuyorsanız, önce array_flip() ile bu diziyi ters çevirerek değerleri anahtar konumuna getirebilir, ardından array_diff_key() fonksiyonunu kullanarak istemediğiniz anahtarları temizleyebilirsiniz.

PHP:
<?php
$row = ["id" => 7, "name" => "Ada", "token" => "x1", "salt" => "y2", "role" => "admin"];

$copy = $row;
unset($copy["token"], $copy["salt"]);
print_r($copy);

$hidden = ["token", "salt", "role"];
print_r(array_diff_key($row, array_flip($hidden)));

Sık Karşılaşılan Hata: array_search ve unset Kullanımı

array_search fonksiyonu aranan değeri bulamadığında false değerini döndürür. Eğer bu sonuç doğrudan dizi anahtarı olarak kullanılırsa, false değeri 0 indeksine karşılık gelir. Bu durum, aranan değer dizide bulunmadığında yanlışlıkla her zaman ilk elemanın silinmesine neden olur:

PHP:
<?php
$fruits = ["apple", "banana", "cherry"];

// "grape" is not there, array_search returns false, false becomes key 0
unset($fruits[array_search("grape", $fruits)]);
print_r($fruits); // apple is gone

// Correct: check the result with !== false
$fruits = ["apple", "banana", "cherry"];
$key = array_search("grape", $fruits);
if ($key !== false) {
    unset($fruits[$key]);
}
print_r($fruits);

Bu hatanın önüne geçmek için array_search sonucunu bir değişkene aktarmalı ve anahtar olarak kullanmadan önce !== false kontrolü yapmalısınız. Sadece if ($key) şeklinde bir kontrol yapmak yeterli değildir; çünkü eşleşme 0. indekste gerçekleştiğinde bu ifade "yanlış" (falsy) olarak değerlendirilir.
 

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

Geri
Üst