PHP’nin array_map fonksiyonu

PHP’nin array_map fonksiyonu

PHP’nin array_map fonksiyonu


Kızılay Web Banner 728X090

PHP’nin array_map fonksiyonu


PHP‘nin dizi (array) işlemleri için çok güzel ve pratik fonksiyonları var. Bunlardan bir tanesi de array_map() isimli fonksiyon. Kısaca görevi, bir dizi içerisinde bulunan bütün değerleri tek tek başka bir fonksiyon ile işlemektir. array_map() fonksiyonu ilk başta bana da etkileyici gelmemişti ama kullanmaya başladıkça ne kadar etkili olduğunu farkettim.


array_map fonksiyonu nasıl işliyor?


Çok basit bir örnek ile bu fonksiyonun görevini anlatmak istiyorum. Örneğin elimizde ülkemizin en büyük 3 şehrinin ismini tutan bir dizi var. Ve biz, bu dizi içerisindeki şehir isimlerini BÜYÜK harflere dönüştüreceğiz. ilk önce array_map() kullanmadan bu işlemi yapmaya çalışalım:


<?php
$sehirler = array('izmir', 'istanbul', 'ankara');
foreach( $sehirler as $key=>$val ){$sehirler[$key] = strtoupper($val);
}?>


Yukarıdaki kod çalıştırıldığında dizi içerisindeki şehir isimleri BÜYÜK harflere dönüşmüş olacaktır. Sonucu da alttaki resimdeki gibi olacaktır:




Şimdi de aynı işlemi array_map() ile aslında ne kadar kolay yapabileceğimizi görelim:


<?php
$sehirler = array('izmir', 'istanbul', 'ankara');
$sehirler = array_map('strtoupper', $sehirler);
?>


Gördüğünüz gibi tek satırda ve döngü bile açmadan aynı işlemi daha pratik bir şekilde yapmış olduk. Burada array_map() fonksiyonuna ilk önce dizi içerisindeki değerlerin tabi tutulmasını istediğimiz fonksiyon ismini, daha sonra da dizinin kendisini yazıyoruz.

array_map() fonksiyonunu $_POST ve $_GET gibi süper global değişkenleriyle de kullanabilirsiniz. Ne de olsa bunlar da aslında birer dizi (array) tipindedir. Örnek için bir formdan POST yöntemiyle gönderilen verileri HTML etiketlerinden temizleyen bir kod yazalım. ilk önce bu işlemi array_map() fonksiyonu kullanmadan yapalım:


<?php
foreach ($_POST as $key=>$val){$_POST[$key] = strip_tags($val);
}?>



Yukarıda yazdığımız kod çok klasik bir yöntem. Bunu pek çok programlama forumunda da görebilirsiniz. Oysaki array_map() fonksiyonu ile bu işlemi tek satırda yapabiliriz.


<?php
$_POST = array_map('strip_tags', $_POST);
?>


Çok boyutlu dizilerde array_map problemi ve çözümü

şimdi de gelelim bu yazıyı yazmama neden olan soruna… array_map() fonksiyonu iyi güzel fakat sadece tek boyutlu dizilerle birlikte çalışıyor. Çok boyutlu dizilerle birlikte kullanmak istediğinizde ise hata veriyor. şimdi yazının başındaki “şehirler” örneğine geri dönelim. ilk önce şehirleri bölge bölge ayırarak çok boyutlu bir dizi oluşturalım:


<?php
$sehirler = array(
'marmara' => array('istanbul', 'kocaeli'),'akdeniz' => array('antalya', 'mersin'),'ege' => array('izmir', 'aydın')
);
?>


Yapacağımız iş yine aynı olsun… Yani dizi içerisindeki bütün değerleri BÜYÜK harflere çevirmeyi deneyelim.


<?php
$sehirler = array_map('strtoupper', $sehirler);
?>


işte bu kodu çalıştırdığımızda “Array to string conversion” hatası alıyoruz. Çünkü array_map() fonksiyonu bu örnekteki gibi içiçe geçmiş olan, yani çok boyutlu dizilerde problem çıkartıyor. Bu problemi gidermek için ben şöyle bir fonksiyon kullanıyorum:


<?php
function array_map_multi($fonk, $dizi){$yeniDizi = array();
foreach($dizi as $key=>$val ){$yeniDizi[$key] = is_array($val) ? array_map_multi($fonk, $val ) : $fonk($val);
}return $yeniDizi;
}?>


array_map_multi() ismini verdiğim bu fonksiyon rekürsif bir yapıda çalışmaktadır. Çünkü eğer kendisine gelen değerin tipi bir dizi (array) ise kendisini yeniden çağırıyor. Bu fonksiyonun kullanımı array_map() fonksiyonu ile aynı…


<?php
$sehirler = array_map_multi('strtoupper', $sehirler);
?>


Ve böylelikle array_map() fonksiyonunu hem tek boyutlu hem de çok boyutlu dizilerle birlikte problemsiz bir şekilde kullanmış oluyoruz.