array_map($callback, $array) $array dizisinin her elemanında $callback çağırır ve sonuçlarla yeni bir dizi döndürür. Önce geri çağırma fonksiyonu, sonra dizi gelir ve orijinal dizi değişmeden kalır.
fn($p) => $p * 1.2 bir ok fonksiyonudur: sonucunu döndüren tek ifadelik bir fonksiyon. Yerine herhangi bir çağrılabilir (callable) kullanılabilir.
Geri çağırma olarak yerleşik bir fonksiyon kullanma
Yerleşik bir fonksiyonun adını dizge olarak verin. Bu, bütün bir diziyi temizlemenin en kısa yoludur: her değeri kırpın, dizgeleri tam sayıya çevirin ya da büyük küçük harfi değiştirin.
array_map('intval', ...) bir formdan veya explode() çıktısından gelen dizgeleri gerçek tam sayılara çevirmenin olağan yoludur. PHP 8.1'deki birinci sınıf çağrılabilir söz dizimi olan intval(...) da yazabilirsiniz; editörünüz bunu otomatik tamamlayıp kontrol edebilir.
Dış değişkenlerle closure kullanma
Bir ok fonksiyonu etrafındaki değişkenleri otomatik olarak görür. Klasik bir function ise onları içeri almak için use ister. İkisi de anonim fonksiyonlar sayfasında açıklanıyor.
Anahtarlarla array_map
Tek bir diziyle array_map dizge anahtarlar dahil anahtarları korur. Ama geri çağırma fonksiyonu yalnızca değeri alır. Anahtarı da almak için ikinci bir dizi olarak array_keys($array) verin: geri çağırma o zaman her diziden birer elemanla çağrılır.
İkinci sonuca dikkat edin: birden fazla dizi verdiğiniz anda anahtarlar 0, 1, 2 ile değiştirilir. Son satırın onları yeniden oluşturmak için array_combine() kullanmasının nedeni budur.
Aynı anda birden çok diziyi eşleme
Her ek dizi geri çağırma fonksiyonuna konumla eşleşen ek bir argüman olur. Dizilerin uzunlukları farklıysa kısa olanlar null ile doldurulur.
Geri çağırma olarak null vermek fonksiyonu atlar ve dizileri çiftler halinde birleştirir:
array_map, array_walk ve foreach karşılaştırması
array_map yeni bir dizi oluşturur. array_walk verdiğiniz diziyi bir referans üzerinden değiştirir ve geri çağırma fonksiyonuna ikinci argüman olarak anahtarı verir. Bir foreach ikisini de yapabilir, ayrıca elemanları atlayabilir veya break ile erken durabilir.
Her eleman tam olarak bir yeni elemana dönüştüğünde array_map kullanın. Bazı elemanları atmanız da gerekiyorsa onu array_filter ile birleştirin ya da bir foreach yazın.
Sık yapılan hata: argüman sırası
array_map önce geri çağırma fonksiyonunu, sonra diziyi alır. Komşusu array_filter ise onları ters sırada alır ve bunları karıştırmak kolaydır:
array_map($callback, $array); // callback first
array_filter($array, $callback); // array first
Yerlerini değiştirmek PHP 8'in bir TypeError fırlatmasına yol açar, çünkü düz bir dizi geçerli bir geri çağırma değildir:
PHP şununla durur:
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
İki argümanın yerini geri değiştirin, blok çalışır.
Sıkça Sorulan Sorular
PHP'de array_map ne işe yarar?
Bir dizinin her elemanında bir fonksiyon çağırır ve sonuçlarla yeni bir dizi döndürür: array_map(fn($n) => $n * 2, [1, 2, 3]) [2, 4, 6] döndürür. Orijinal dizi değişmez.
array_map anahtarları korur mu?
Tek bir diziyle evet: dizge ve tam sayı anahtarlar olduğu gibi kalır. İki veya daha fazla diziyle sonuç her zaman yeni 0, 1, 2... anahtarlarını alır.
array_map geri çağırma fonksiyonunun içinde anahtarı nasıl alırım?
Anahtarları ikinci bir dizi olarak verin: array_map(fn($k, $v) => "$k=$v", array_keys($arr), $arr). Sonuç bir listedir, orijinal anahtarlara geri ihtiyacınız varsa array_combine(array_keys($arr), ...) ile sarın.
array_map foreach'ten daha mı hızlı?
Kayda değer biçimde değil. İkisi de diziyi bir kez dolaşır ve düz bir foreach eleman başına fonksiyon çağrısından kaçındığı için çoğu zaman biraz daha hızlıdır. Daha iyi okunduğunda array_map seçin: yeni bir dizi üreten tek bir dönüşüm.
array_map ile array_walk arasındaki fark nedir?
array_map yeni bir dizi döndürür ve girdiye dokunmaz. array_walk true döndürür ve diziyi bir referans parametresi üzerinden yerinde değiştirmek içindir: array_walk($arr, function (&$v, $k) { $v = trim($v); });.