array_map($callback, $array) fonksiyonu, belirtilen $array dizisindeki her bir öğe için $callback fonksiyonunu çalıştırır ve elde edilen sonuçlardan oluşan yeni bir dizi üretir. Burada parametre sırası önemlidir: önce çağrılacak fonksiyon, ardından dizi yazılır. Orijinal dizi üzerinde herhangi bir değişiklik yapılmaz.
PHP:
<?php
$prices = [10, 25, 40];
$withTax = array_map(fn($p) => $p * 1.2, $prices);
print_r($withTax);
print_r($prices); // unchanged
fn($p) => $p * 1.2 kullanımı bir ok fonksiyonu (arrow function) örneğidir ve tek bir ifadeyle sonuç döndürür. Bunun yanı sıra, çağrılabilir (callable) olan her türlü yapı burada kullanılabilir.Yerleşik fonksiyonların geri çağırma olarak kullanımı
PHP'nin yerleşik fonksiyonlarını dizge (string) olarak belirterek kullanabilirsiniz. Dizi içerisindeki verileri topluca temizlemek, değerleri tam sayıya dönüştürmek veya büyük/küçük harf düzenlemeleri yapmak için en pratik yöntem budur.
PHP:
<?php
$raw = [" apple ", "Banana ", " cherry"];
print_r(array_map('trim', $raw));
$ids = ["4", "15", "42"];
var_dump(array_map('intval', $ids));
$names = ["ada", "grace", "linus"];
print_r(array_map('ucfirst', $names));
Özellikle form verileri veya
explode() fonksiyonundan dönen metinleri sayıya çevirmek için array_map('intval', ...) kullanımı oldukça yaygındır. PHP 8.1 ile gelen birinci sınıf çağrılabilir (first-class callable) söz dizimi sayesinde intval(...) şeklinde de yazım yapabilirsiniz; bu yöntem editörlerin otomatik tamamlama ve kontrol özelliklerinden yararlanmanızı sağlar.Closure yapısı ve dış değişkenler
Ok fonksiyonları, dış kapsamdaki değişkenlere otomatik olarak erişebilir. Ancak geleneksel
function tanımlamalarında, dışarıdaki bir değişkeni kullanabilmek için use anahtar kelimesinin kullanılması gerekir.
PHP:
<?php
$rate = 0.15;
$amounts = [100, 250, 80];
// Arrow function: $rate is captured automatically
$tips = array_map(fn($a) => round($a * $rate, 2), $amounts);
print_r($tips);
// Classic closure: $rate must be listed in use()
$tips2 = array_map(function ($a) use ($rate) {
return round($a * $rate, 2);
}, $amounts);
print_r($tips2);
array_map ve dizi anahtarları
array_map tek bir dizi ile kullanıldığında, string anahtarlar da dahil olmak üzere anahtarları muhafaza eder. Fakat geri çağırma fonksiyonu parametre olarak sadece değeri alır. Eğer anahtara da ihtiyaç duyuyorsanız, ikinci bir parametre olarak array_keys($array) dizisini ekleyebilirsiniz; böylece fonksiyon her iki diziden de birer eleman alarak çalışır.
PHP:
<?php
$stock = ["apples" => 12, "pears" => 0, "plums" => 7];
// Keys are kept
print_r(array_map(fn($n) => $n * 2, $stock));
// Key and value in the callback
$lines = array_map(
fn($name, $count) => "$name: $count",
array_keys($stock),
$stock
);
print_r($lines);
// Same, with the original keys put back
print_r(array_combine(array_keys($stock), $lines));
Kod sonuçlarına bakıldığında, birden fazla dizi kullanıldığında anahtarların sıfırlanarak
0, 1, 2 şeklinde yeniden indekslendiği görülür. Bu yüzden orijinal anahtarları geri kazanmak için array_combine() fonksiyonuna başvurulmuştur.Birden fazla diziyi aynı anda eşleme
Fonksiyona eklenen her yeni dizi, geri çağırma fonksiyonuna karşılık gelen konumda yeni bir argüman olarak iletilir. Eğer kullanılan dizilerin uzunlukları eşit değilse, kısa kalan dizilerin eksik kısımları
null ile tamamlanır.
PHP:
<?php
$first = ["Ada", "Grace", "Linus"];
$last = ["Lovelace", "Hopper", "Torvalds"];
print_r(array_map(fn($f, $l) => "$f $l", $first, $last));
// Different lengths: missing values arrive as null
$a = [1, 2, 3];
$b = [10, 20];
print_r(array_map(fn($x, $y) => $x + ($y ?? 0), $a, $b));
Geri çağırma parametresi olarak
null değeri verildiğinde, herhangi bir fonksiyon çalıştırılmaz ve diziler eleman bazlı çiftler şeklinde birleştirilir:
PHP:
<?php
$names = ["Ada", "Grace"];
$years = [1815, 1906];
print_r(array_map(null, $names, $years));
array_map, array_walk ve foreach arasındaki farklar
array_map işlemi sonucunda tamamen yeni bir dizi üretilir. array_walk ise mevcut diziyi referans yoluyla doğrudan değiştirir ve fonksiyonuna ikinci parametre olarak anahtarı iletir. foreach döngüsü ise her iki işlemi de gerçekleştirebilir, ayrıca bazı elemanları görmezden gelme veya break ile döngüden erken çıkma imkanı sunar.
PHP:
<?php
$tags = [" php ", " arrays", "map "];
// New array, input untouched
$clean = array_map('trim', $tags);
// Change in place: note the & before $value
array_walk($tags, function (&$value, $key) {
$value = "#$key " . trim($value);
});
print_r($clean);
print_r($tags);
Eğer her dizi elemanının birebir yeni bir değere dönüştürülmesi gerekiyorsa
array_map idealdir. Ancak işlem sırasında bazı elemanların elenmesi gerekiyorsa, bunu array_filter ile kombine edebilir veya doğrudan bir foreach döngüsü kurabilirsiniz.Sık karşılaşılan hata: Parametre sırası
array_map fonksiyonunda önce geri çağırma fonksiyonu, sonra dizi belirtilir. Benzer bir işlev olan array_filter ise parametreleri tam tersi sırada aldığı için bu iki fonksiyon sıkça karıştırılmaktadır:
PHP:
array_map($callback, $array); // callback first
array_filter($array, $callback); // array first
Parametrelerin yerini değiştirdiğinizde, PHP 8 düz bir diziyi geçerli bir geri çağırma fonksiyonu olarak görmediği için bir
TypeError hatası verecektir:
PHP:
<?php
// This throws a TypeError on purpose: the arguments are swapped
$numbers = [1, 2, 3];
$doubled = array_map($numbers, fn($n) => $n * 2);
PHP şu hata mesajıyla işlemi durdurur:
Kod:
PHP Fatal error: Uncaught TypeError: array_map(): Argument #1 ($callback) must be a valid callback or null, array callback must have exactly two members in /home/index.php:4
Argümanların sırasını düzelttiğinizde kod sorunsuz çalışacaktır.
Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 6
- Görüntüleme
- 23
- Cevaplar
- 5
- Görüntüleme
- 17
- Cevaplar
- 6
- Görüntüleme
- 23
- Cevaplar
- 6
- Görüntüleme
- 27
- Cevaplar
- 6
- Görüntüleme
- 24
