Array map fonksiyonunun kullanımını ve pratikte kullanabileceğimiz özelliklerini tek tek inceleyelim.
İlk başta php manuelden array_map in yardım sayfasına ulaşıyorum. Bu sayfaya baktığımda fonskiyonun kullanımını tamamen bana ifade ediyor.
Kullanımını incelersek ilk paremetrenin çalıştırmak istediğim fonksiyon olduğunu. Daha sonra en az bir dizi olmak üzere birden fazla dizi şeklinde ikinci parametre olarak diziler verebildiğimi görüyoruz. İşte bu fonksiyonu çağırdığımızda fonksiyon verilen diziye ilk paremetre olarak verilen fonksiyonu tek tek tüm elemanları olmak üzere uygulayacaktır.Yeni oluşan dizi ise bu fonksiyondan dönen dizi değeri olarak elimize geçecektir.
Bunun ne yaptığını işlevini incelemek için basit bir örnek oluşturalım.
$a şeklinde bir dizim olduğunu farzedelim. Bu dizinin elemanları 2,3,4,5 şeklinde olsun.
$a = array(1,2,3,4,5);
Ben bu dizinin tüm elemanlarının karesini almak istersem. Bir döngü ile dönmek sureti ile mevcut dizinin elemanının karesini alıp tekrar kendine atayarak işlem yapabilirim.
Bunun için basit bir for döngüsü kurduğumu düşünelim.
for($i=0; $i
$a dizisinin $i inci indisini kendisi ile çarpmak suretiyle karesini alcaz
$a[$i] = $a[$i] * $a[$i];
Daha sonra print_r ile dizimin tamamını yazdırıyorum.
print_r($a);
$a = array(1,2,3,4,5);
for($i=0; $i
$a[$i] = $a[$i] * $a[$i];
}
print_r($a);
?>
Bu sayfayı browserdan çağırdığımda Dizimin tüm elemanlarının karesi alınıp yazdırıldığını görüyoruz
İşte bu işlemi bu şekilde uzatmak yerine şöyle bir uygulamada yapabilirdik. kare adında bir fonksiyonumuz olduğunu düşünelim. Bir elemanın karesini alabilmek için onun değerini alıp yine kendisi ile çarparsak. Daha sonrada bu değeri döndürürsek. Bu verdigimiz fonksiyon artık kare işlemini gerçekleştirebiliyor.
function kare($value){
$value = $value * $value;
return $value;
}
İşte az önce uyguladığımız döngü yerine array_map fonksiyonunu ilk parametre olan fonksiyon kare olacak şekilde $a dizisine uygulayıp sonucu yine $a dizisine uygulamasını söyleyerek sayfayı çağırdığımızda sonucun dığru olarak geldigini görüyoruz.
function kare($value){
$value = $value * $value;
return $value;
}
$a = array(1,2,3,4,5);
$a = array_map('kare', $a);
print_r($a);
?>
Peki dizimiz burdaki gibi tek boyutlu değilde iki boyutlu şeklinde bir matris olsaydı
$a = array( array(1,2) , array(3,4) );
Fonksiyonu uygulamadan önce $a dizimizi bir görelim
function kare($value){
$value = $value * $value;
return $value;
}
$a = array( array(1,2) , array(3,4) );
$a = array_map('kare', $a);
print_r($a);
?>
Dizimizin sıfırıncı indisi yine bir dizi şeklinde. 1 ve 2 değerlerine sahip. Birinci değeride 3 ve 4 şeklinde ikinci bir dizi şeklinde. Doğal olarak bu diziyi uygulamaya çalıştığımda array_map fonksiyonumuzu çağırdığımızda bize Unsupported operand type şeklinde hata vercektir.
Çünkü şu an fonksiyonu çağırdığımızda sadece dizinin elemanlarına uyguladığı için bu işlem bizim düşündüğümüzü yapmayacak ve diziye çarpma uygulamaya çalıştığımız için problemle karşılaşılacağız.İşte bu gibi durumda her bir dizinin verilen elemanına tekrar kare işlemini uygulamalıyız Yani burda gördüğümüz üzere 1e ve 2 ye yani dizinin ilk dizisine kare işlemi uygulandıktan sonra tekrar ikinci kısımada kare işlemini uygulaması gerekiyor. Tabi burda dizimiz matris şeklindeyken içine 7 şeklinde bir eleman daha eklersek burda 7 dizi olmadığı için bi kere uygulamamız mümkün değil.
İşte burdaki kare fonksiyonunu kendini çağıracak yani recursive hale dönüştürerek özyenilemeli daha adaptif hale getirebiliriz.
Bunun için fonksiyonumuzu şu hale dönüştürelim; Bi kere is_array ile bize döndürülen değerin dizi olup olmadığını kontrol edelim. Eğerki dizi ise yine array_map ile kare fonksiyonunu bu diziye uygulamamız gerekiyor. Eğerki dizi değilse direk burdan değerin olduğu gibi çarpımını alıp dönderebiliriz.
function kare($value){
if( is_array($value) ){
$value = array_map('kare', $value);
}else{
$value = $value * $value;
}
return $value;
}
$a = array( array(1,2) , array(3,4) );
$a = array_map('kare', $a);
print_r($a);
?>
Bu şekilde fonskiyonumuzu düzenleyip tekrar çağırdığımda dizim matris şeklinde olmasına rağmen array_map fonksiyonunun uygun şekilde çalıştığını görüyoruz.
Kodları tekrar incelersek aslında çok kompleks bir işlem yapmadık. Bize gönderilen değerin dizi olup olmadığına baktık eğerki diziyse tekrar bu işlemi uyguladık. Burda matris şeklinde bile olsaydı yine gelen değer bir dizi olduğu için.
function kare($value){
if( is_array($value) ){
$value = array_map('kare', $value);
}else{
$value = $value * $value;
}
return $value;
}
$a = array( array(1,array(8,9)) , array(3,4) );
$a = array_map('kare', $a);
print_r($a);
?>
Ve biz bunu özyenilemeli olarak çağırdığımız için sorunsuz çalışacaktır.
İşte array_map le tek bir diziye fonksiyon uygularken biraz adaptif hale getirerektre yine fonksiyonu uygulayabiliriz. array_map fonksiyonu daha önce problem yaşadığımız veya çok farkında olmadığımız stripslashes işlemi içinde kullanılabilinir. Php kullanan herkes bilirse. Eğerki get magic quotas fonksiyonu açıksa php.ini ayarlarından otomatikmen gönderilen $_GET, $_POST, $_COOKIE ve $_REQUEST değerlerine daha doğrusu sistem açılırken oluşan bu değerlerin tırnakların başına slaş \ işareti atmaktadır. İşte bu slaş işaretinden kurtulmak için $_GET, $_POST, $_COOKIE, $_REQUEST değişkenlerime yine array_map fonskyionunu uygulayabilirim Bu fonksiyonumuzu biraz daha işlevsel hale getirip array_map fonksiyonunu uygulayalım
get_magic_quotas_gpc nin doğruluğunu kontrol ediyorum Eğerki doğruysa o zaman işlem yapmam gerekiyor. Fonksiyonumun adını stripslashesAll olarak değiştiriyorum. ve farklı olarak eğerki diziyse
$value = array_map('stripslashesAll ', $value);
Eğerki dizi değil normal indise eriştiğimde ise stripslash fonksiyonunu uyguluyorum ve değeri dönderiyorum. İşte bu oluşturduğum fonksiyonu $_GET dizisine uygulayarak, sonra $_POST dizisine uygulayarak sonra $_COOKIE dizisine uygulayarak. ve $_REQUEST dizisine uygulayarak İşte eğer ki magic quota aktifse
<?php
if( get_magic_quotes_gpc() ){
function stripslashesAll($value){
if( is_array($value) ){
$value = array_map('stripslashesAll',$value);
}else{
$value = stripslashes($value);
}
return $value;
}
$_GET = array_map('stripslashesAll',$_GET);
$_POST = array_map('stripslashesAll',$_POST);
$_COOKIE = array_map('stripslashesAll',$_COOKIE);
$_REQUEST = array_map('stripslashesAll',$_REQUEST);
}
?>
Tüm $_GET, $_POST, $_COOKIE ve $_REQUEST değişkenlerine çok boyutlu dizi bile olsa uygulayarak stripslash yapabilirim. Evet fonksiyonumuzu böylece tamamlamış olduk.
array_map ile işte çok boyutlu yada tek boyutlu diziye kodlarimizi biraz adaptif hale getirerek istediğim fonksiyona tabi tutabilirim.