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

Altın Konu PHP'de Dizi Ayrıştırma (Destructuring) ve list() Kullanımı

image.jpeg


[$a, $b] = $array; yazımı, bir dizideki değerleri tek bir işlemle farklı değişkenlere atamanızı sağlar: bu örnekte $a değişkeni $array[0] değerini, $b ise $array[1] değerini alır. Bu işlemin daha eski bir versiyonu olan list($a, $b) = $array; kullanımı da aynı sonucu verir. Ayrıca ['name' => $name] = $user; şeklinde bir kullanım ile atamalar doğrudan anahtar isimleri üzerinden gerçekleştirilebilir.

PHP:
<?php
$point = [3, 7];
[$x, $y] = $point;
echo "x = $x, y = $y\n";

// Same thing with list()
list($x, $y) = $point;
echo "x = $x, y = $y\n";

// Very common with explode()
[$user, $domain] = explode('@', 'ada@example.com');
echo "User: $user, domain: $domain\n";

Bu ayrıştırma yöntemini explode() fonksiyonu ile beraber kullanmak oldukça yaygındır; önce bir metni parçalara ayırıp ardından bu parçaları doğrudan isimlendirilmiş değişkenlere atayarak ilerleyebilirsiniz.

Belirli Elemanları Atlamak

Dizideki bazı elemanları almak istemiyorsanız, o kısımları boş bırakarak atlayabilirsiniz. Ayrıca dizinin sonundaki kullanılmayan elemanları görmezden gelerek işlemi erken sonlandırabilirsiniz.

PHP:
<?php
$row = ['2026-03-14', 'Ada', 'Lovelace', 'admin', 'active'];

[, $first, $last] = $row;            // skip the date, ignore the rest
echo "$first $last\n";

[$date, , , $role] = $row;           // skip two in the middle
echo "$date: $role\n";

// Only the time part of a timestamp string
[, $time] = explode(' ', '2026-03-14 09:30:00');
echo "Time: $time\n";

İlişkisel Dizilerde Anahtar Bazlı Ayrıştırma

Anahtar kullanarak yapılan ayrıştırmalarda dizideki sıralama önem taşımaz ve sadece ihtiyaç duyduğunuz verileri seçip alabilirsiniz. Bu yöntemde anahtar ismi => işaretinin soluna, atanacak değişken ise sağına yazılır.

PHP:
<?php
$user = ['id' => 7, 'name' => 'Grace', 'email' => 'grace@example.com', 'age' => 45];

['name' => $name, 'email' => $email] = $user;
echo "$name <$email>\n";

// Rename while you extract
['id' => $userId] = $user;
echo "User #$userId\n";

// Keys can be expressions
$field = 'age';
[$field => $value] = $user;
echo "$field: $value\n";

// Nested: reach inside a nested array
$order = ['id' => 5, 'customer' => ['name' => 'Ada', 'country' => 'UK']];
['id' => $id, 'customer' => ['country' => $country]] = $order;
echo "Order $id ships to $country\n";

Bu yapı iç içe de kullanılabilir; örneğin [[$x1, $y1], [$x2, $y2]] = $line; koduyla aynı anda iki farklı koordinat noktasını okuyabilirsiniz. PHP 7.3 sürümüyle birlikte, ayrıştırma kalıpları içinde referans kullanımı da mümkün hale gelmiştir: [, &$second] = $counts; şeklinde bir kullanımda, $second değişkeni değiştirildiğinde dizinin orijinal değeri de güncellenir.

Bir atama işleminde ya sadece konumlar (indeksler) ya da sadece anahtarlar kullanılmalıdır; her iki yöntem aynı anda kullanılamaz. [$a, 'k' => $b] = $arr; şeklinde bir deneme, Cannot mix keyed and unkeyed array entries in assignments hatasına yol açar.

Değişkenlerin Yerini Değiştirme

İki değişkenin değerini birbirleriyle takas etmek için, değerleri ters sırada içeren geçici bir dizi oluşturup bunu hemen geri ayrıştırabilirsiniz. Bu sayede üçüncü bir ara değişken kullanmanıza gerek kalmaz.

PHP:
<?php
$a = 'left';
$b = 'right';

[$a, $b] = [$b, $a];
echo "$a $b\n";

// Rotate three values
$x = 1; $y = 2; $z = 3;
[$x, $y, $z] = [$y, $z, $x];
echo "$x $y $z\n";

Fonksiyonlardan Çoklu Değer Döndürme

PHP fonksiyonları standart olarak tek bir değer döndürür, ancak bu değer bir dizi olabilir. Fonksiyonu çağırdığınız noktada bu diziyi ayrıştırarak, sanki fonksiyon birden fazla değer döndürüyormuş gibi bir yapı kurabilirsiniz. Eğer döndürülen değer sayısı üçten fazlaysa, çağıran kişinin sırayı karıştırmaması için değerleri anahtarlarla döndürmek daha güvenlidir.

PHP:
<?php
function minMax(array $numbers): array
{
    return [min($numbers), max($numbers)];
}

[$low, $high] = minMax([4, 9, 1, 7]);
echo "Range: $low to $high\n";

function parseName(string $full): array
{
    $parts = explode(' ', $full, 2);
    return ['first' => $parts[0], 'last' => $parts[1] ?? ''];
}

['last' => $last, 'first' => $first] = parseName('Ada Lovelace');
echo "$last, $first\n";

foreach Döngüsünde Ayrıştırma

Aynı ayrıştırma söz dizimi foreach döngüsünün içinde de geçerlidir. Böylece döngünün her adımında veriler otomatik olarak isimlendirilmiş değişkenlere dağıtılır. "foreach ile list() kullanımı" ifadesiyle kastedilen yöntem budur.

PHP:
<?php
$routes = [
    ['GET', '/users', 'listUsers'],
    ['POST', '/users', 'createUser'],
    ['GET', '/users/{id}', 'showUser'],
];

foreach ($routes as [$method, $path, $handler]) {
    printf("%-5s %-12s -> %s()\n", $method, $path, $handler);
}

$people = [
    ['name' => 'Ada', 'city' => 'London'],
    ['name' => 'Linus', 'city' => 'Helsinki'],
];

foreach ($people as ['name' => $name, 'city' => $city]) {
    echo "$name lives in $city\n";
}

Açma Operatörü (...)

Üç nokta (...) operatörü, bir diziyi olduğu yerde açarak elemanlarına ayırır. Bir dizi tanımı içerisinde [...$a, ...$b] şeklinde kullanıldığında dizileri birleştirir. Bir fonksiyon çağrılırken f(...$args) şeklinde kullanıldığında dizinin her elemanını ayrı birer argüman olarak iletir. Fonksiyon tanımlarında ise ...$args kullanımı, gönderilen fazla tüm argümanları tek bir dizi altında toplar.

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

// String keys too (PHP 8.1): later keys win, like array_merge
$defaults = ['color' => 'blue', 'size' => 'M'];
$custom = ['size' => 'L'];
print_r([...$defaults, ...$custom]);

// Unpack into function arguments
$numbers = [4, 9, 1];
echo max(...$numbers), "\n";

// Collect any number of arguments
function total(float ...$amounts): float
{
    return array_sum($amounts);
}
echo total(1.5, 2.5, 6), "\n";

PHP 8.1 öncesinde, metin tabanlı anahtarları olan bir diziyi bu operatörle açmak hataya neden oluyordu; artık bu işlem array_merge() fonksiyonundaki mantıkla çalışmakta, metin anahtarları korunurken sayısal anahtarlar yeniden numaralandırılmaktadır. ...$amounts gibi değişken sayıda parametre kullanımıyla ilgili detaylar fonksiyonlar bölümünde ele alınmaktadır.

Sık Karşılaşılan Hata: Eksik Dizi Elemanları

Eğer dizi, tanımlanan kalıptan daha az eleman içeriyorsa, eksik kalan değişkenlere null atanır ve PHP bir uyarı mesajı verir. Bu durum genellikle kontrol edilmemiş kullanıcı girişlerinde veya eksik sütunlu satırlarda meydana gelir. Örneğin [$name, $city, $country] = explode(',', 'Grace'); kodu çalıştırıldığında PHP şu hatayı verir:

Kod:
Warning: Undefined array key 1 in /var/www/html/import.php on line 5

Warning: Undefined array key 2 in /var/www/html/import.php on line 5

Bu sorunu önlemek için, ayrıştırma işleminden önce dizinin eksik parçalarını tamamlamanız gerekir:

PHP:
<?php
$lines = ['Ada,London,UK', 'Linus,Helsinki', 'Grace'];

foreach ($lines as $line) {
    [$name, $city, $country] = array_pad(explode(',', $line), 3, 'unknown');
    echo "$name | $city | $country\n";
}

Anahtarlı yapılar için ise, işlemden önce varsayılan değerleri birleştirebilirsiniz: ['a' => $a, 'b' => $b] = $input + ['a' => null, 'b' => null];. Buradaki + operatörü, sadece $input dizisinde bulunmayan anahtarları ekleyerek eksikleri tamamlar.
 

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

Geri
Üst