BÖLÜM 5 DÖNGÜLER VE DİZİLER Döngüler,yazdığımız komutlarla istediğimiz bir işlemi bilgisayarın yüzlerce,binlerce,ve hatta milyonlarca defa tekrarlamasıdır. Biraz açıklamak istersek,eğer bilgisayara bir görevi yapması için emir veriyorsak ve bilgisayar bu emri başarılı bir şekilde yerine getiriyorsa neden aynı işlemi doğru olarak bizim istediğimiz sayı kadar veya istediğimiz şartlar yerine gelene kadar tekrarlamasın ki? PHP içerisinde her programlama dilinde olduğu gibi bu konu için yazım mekanizmaları geliştirilmiştir. Burada öğreneceğiniz döngü yapıları size diğer programlama dillerini öğrenirken de görüş olarak yardımcı olacaktır. Bu bölümde aşağıdaki konular için detaylı açıklamalar bulacaksınız, "while" döngüsü, (THA while lop) "do while" döngüsü, "for" döngüsü, Dizilerin yaratılması (Creating Arrays) Dizilerden değer okunması Dizilerin İndekslenmesi Dizilerin Sıralanması Çok Boyutlu Diziler Döngü ve Diziler için pratik örnekler Döngüler Bir önceki konuda formlar üzerinde yapılan kontrol işlemleri anlatılmıştı. Bu form kontrollerinde istediğimiz şartlara göre form verilerinin işlenip işlenmemesi gerektiğine,php yazdığımız "if" komutları ile karar veriyordu. Döngülerde durum biraz daha değişik çünkü,php bizim yazdığımız şartlar oluşuncaya kadar,döngü içerisinde verilen kod grubunu çalıştıracaktır. Döngünün yaptığı bu her bir işleme "iteration" yani "öteleme" adı verilir. Döngünün her bir dönüşü bizim için bir "iterasyon" dur. while döngüleri İlk anlatacağımız döngü yapımız "while". Bunun sebebi yapı olarak en basit olan döngünün "while" olmasıdır.
while (şartımız doğruysa) Bu parantezlerin içersindeki kod grubunu uygula Parantezlerin içerisindeki kod grubu uygulandıktan sonra eğer döngümüzün en başında verdiğimiz şart halen doğrulanıyorsa,döngümüz bir kez daha çalışacaktır. Bu döngü bizim döngümüzün başında verdiğimiz şart "yanlış" değerini döndürene kadar devam edecektir. while (ay dolunay) Kuşlar Uyuyacak Bir başka örnek verecek olursak,uygulamamız içerisinde kullanıcının kredi kartı limitini aşması durumunda "sepet"'inden bazı ürünleri çıkarmak istiyoruz. Aşağıda bununla ilgili bir kod parçası görülmektedir. While ($AlisverisToplami > $KrediLimiti) echo ("Kredi limitinizi astığınız için son aldığınız urun sepetinizden çıkarıldı"); $AlisverisToplami = $AlisverisToplami - $SonAlisveris; $SonAlisveris = $SonAldigiUrun; Eğer müşteri kredi limitini asarsa,son aldığı urunu iptal ediyoruz. Bunu, toplam faturasından ürünün fiyatını düşerek yapıyoruz. Daha sonra $SonAlisveris değişkeni içerisinde saklanan değeri $SonAldigiUrun değişkeni ile değiştirip her seferinde döngümüzde,eğer kredi limiti asılıyorsa kullanıcının aldığı son ürünleri birer birer sepetinden çıkartmış oluyoruz. Burada dikkat edilmesi gereken nokta eğer $KrediLimiti olarak verilen değer negatif olursa döngümüzün asla son bulmayacağıdır. Her zaman eğer döngülerle 65
çalışıyorsanız aklınızda olması gereken nokta döngünün verilen değişik değerler karsısında ne yapacağını hesaplamanızdır. Şimdi yukarıda açıkladığımız "while loops" yani "while döngüleri" için bir uygulama yazalım. 1. Text editörünüzü açıp aşağıdaki kodları yazın. <HTML> <HEAD></HEAD> <BODY> Seres Bankası Kredi İsteme Formu <FORM METHOD=POST ACTION="kredi3. php" Ne kadar kredi almak istiyorsunuz? <INPUT NAME="Kredi" TYPE="Radio" VALUE=1000>Kredi miktarı 1000 TL Faiz %5 <INPUT NAME="Kredi" TYPE="Radio" VALUE=5000>Kredi miktarı 5000 TL Faiz %10 <INPUT NAME="Kredi" TYPE="Radio" VALUE=10000>Kredi miktarı 10000 TL Faiz %15 Aylık ne kadar geri ödeme yapabilirsiniz? <INPUT NAME="AylikOdeme" TYPE=Text SIZE=5> <INPUT TYPE=SUBMIT VALUE="Buraya tıklayarak Geri ödeme için kaç Ay gerektiğini Hesaplayın"> </FORM> </BODY> </HTML> 2. Bu dosyayı "kredi3. html" olarak kayıt edin. 3. Yeni bir text dosyaysa açıp aşağıdaki kodları yazın. 66
<HTML> <HEAD></HEAD> <BODY> <?php $Sure=0; switch ($Kredi) case 1000: $Faiz = 5; break; case 5000: $Faiz = 6. 5; break; case 10000: $Faiz = 8; break; default: echo "Bir paket seçmelisiniz!"; exit; while ($Kredi > 0) $Sure = $Sure + 1; $AylikNet = $AylikOdeme - ($Kredi*$Faiz/100); if ($AylikNet<=0) echo "Daha yüksek bir ödeme miktarı seçmelisiniz!"; exit; $Kredi = $Kredi - $AylikNet; echo "Toplam $Sure ayda yüzde $Faiz faiz ile kredinin tamamını ödemiş olacaksınız. ";?> </BODY> </HTML> 4. Bu dosyayı "kredi3. php" olarak kayıt edin. 5. "kredi3. html" dosyasını açın ve bir kaç veri girin. Program nasıl çalışıyor? Formdan gelen veriler yazdığımız PHP programına ulaştığında şu verileri kesin olarak biliyoruz, 67
$Kredi $Faiz $AylikOdeme Şimdi ilk yaptığımız işlem kullanıcının seçtiği pakete göre faiz oranı ve kredi miktarını programda tanımlamak. Bunun için "switch" komutunu kullanarak elimizde bulunan bütün koşulları programın içinde tanımlıyoruz.. $Kredi değişkenin alabileceği 3 tane değer vardır. Bunlar 100,5000,ve 10000 dir. Biz bu değerleri kullanarak program içinde $Faiz değişkeni içinde bir atama yapılmasını sağlıyoruz. Bunu hangi kredi miktarını kullanıcı seçmiş ise "switch" ile tanımlarken bir alttaki satırda $Faiz değişkenine değer atayarak yapıyoruz. $AylikOdeme miktarını da zaten kullanıcımız en başta bizim için text alanına girmişti. Bu noktadan sonra artık "while" döngümüzü kullanarak kişinin bu aldığı krediyi kaç ayda tam olarak geri ödeyebileceğini hesaplayabiliriz. While ($Kredi >0) Bu ifade ile döngümüzü başlatıyoruz. Kredi miktarımız mutlaka sıfırdan büyük olmalıdır. Zaten $Kredi değişkenimizin alabileceği 3 tane değer var ve bunlar sıfırdan farklı. o yüzden sorun çıkması ihtimali yok. Bir sonraki satırda programı yazmamızın amacı olan kaç ayda ödeyebileceği sorusuna cevap verecek $Sure sayacımızı tanımlıyoruz. döngümüz her çalıştığında bu sayaç birer birer artacak. Bu değişken içerisinde,böylece döngü sonuçlanınca döngünün kaç defa çalıştığı yani aylık ödemelerin kaç ayda tamamlanacağı değeri bu değişkende saklanmış olacak. Döngü mesela iki defa çalışıp biterse demek ki kullanıcı 2 ayda tüm krediyi geri ödemiş olacak. $Sure = $Sure + 1; Bir alttaki satırda aylık ödemelerin ne kadar olacağı hesaplanıyor. Bu değer tabiî ki faiz miktarı düşüldükten sonra olmalıdır. çünkü kullanıcını nin ödediği paranın belli miktarını faize gidecek. Eğer faiz işin içinde olmasaydı tabii ki kullanıcıdan gelen bütün parayı ($AylikOdeme) göz önünde bulundurup faiz kısmini işin içine katmayacaktık. Faize giden parayı sanki kullanıcı hiç ödemeyecek gibi düşünebilirsiniz. 68
$AylikNet = $AylikOdeme - ($Kredi * $Faiz/100); yukarıda gördüğünüz gibi $Kredi ile $Faiz oranı çarpılıp yüzdesi alınmakta. Bu miktarı kullanıcının aylık ödemesinde düşmekteyiz. bu şekilde net olarak kullanıcıdan gelen net miktarı hesaplıyoruz. Bir sonraki satırda, if (AylikNet <= 0) echo "Aylık ödeme miktarını biraz daha yüksek seçmelisiniz"; exit; Kod grubu ile,kullanıcıdan gelen miktar eğer faizi bile karşılamaya yetmiyorsa programın yapacağı işlem tanımlanıyor. Eğer böyle durum olursa "exit" komutu ile program sonlanıyor. Bir sonraki, $Kredi = $Kredi - $AylikNet; Kod satırında kullanıcının aldığı kredi miktarından,ödediği miktar düşülerek yeni değer yine $Kredi değişkeninde saklanıyor. Böylece döngümüzün bir defalık çevrim sürecini açıklamış olduk. döngümüz tüm bu işlemleri, While ($Kredi >0) Şartımız "false" oluncaya kadar tekrarlayacaktır. gördüğünüz gibi döngünün her çalışmasında $Kredi değişkeni içerisinde saklanan değer yavaş yavaş azalmaktadır. Çünkü döngü her çalıştığında $Kredi = $Kredi - $AylikNet; formülü ile $Kredi değişkenin değerini düşürmektedir. Şimdi bir de sayısal örnek vererek döngünün nasıl çalıştığını açıklayalım. Örnek olarak kullanıcının 1000 dolarlık krediyi yüzde 5 faiz ile aldığını kabul edelim. kullanıcımız aylık 100 dolar ödeyebileceğini soyluyor. O zaman değişkenlerin değerleri aşağıdaki gibi olacaktır. 69
$Kredi = 1000 $Faiz = 5 $Sure = 0 $AylikOdeme = 100 döngümüzün en başında, kullanıcının aldığı Kredi 1000 dolar,faiz oranı 5, Aylık ödeme 100 ve Sure 0 olacaktır. Şimdi programın ilk satırı şöyle olacaktır, while (1000>0) Evet 1000 sayısı 0 sayısından büyük rahatlıkla döngünün içerisindeki işlemler uygulanabilir. $Sure = 0 + 1; Şimdi $Sure değişkenimiz 1 e eşit. Bir sonraki satır, $AylikNet = 100 - (1000*5/100); $AylikNet = 100-50; artık $AylikNet değişkenimiz 50'ye eşit. Son satırda bu değeri yerine koyuyoruz $Kredi = 1000-50; Artık $Kredi değişkenimiz 950 dir. Program en başa dönerek bu değeri kontrol değeri ile karşılaştıracaktır. While (950>0) Evet 950 sayısı 0 sayısından büyük rahatlıkla döngünün içerisindeki işlemler tekrar uygulanabilir. $Sure = 1 + 1; artık $Sure değişkenimiz 2 ye eşit. $AylikNet = 100 - (950*5/100); Artık $AylikNet değişkenimiz 52. 5 e eşittir. 70
$Kredi = 950-52. 5; Artık $Kredi değişkenimiz 897. 5 e eşittir. While (897. 5>0) Evet 897. 5 büyüktür 0 dan diyerek aynı şekilde döngü $Kredi değeri 0'a veya 0 dan küçük bir sayıya eşit olana kadar devam edecektir. Zaten $Kredi değişkeni 0 dan küçük olunca bizim kullanıcımızda Kredinin tamamını ödemiş demektir. Döngümüz çalışmayı bitirince döngünün dışındaki ilk satırdan programın işleyişi devam eder ve en sonunda "echo" komutuyla "$Sure" değişkeninin içindeki değer ekrana yazılır. "do while" döngüleri "do while" döngüleri bir önceki konuda anlatılan "while" döngüleri ile benzer işlemleri yapmakla beraber bir önemli fark içermektedirler. Döngünün kontrol deyimi,döngünün sonunda yer almaktadır. Bu durum döngü yapımızın, verdiğimiz koşullar ne olursa olsun en az bir kere çalışacağını göstermektedir. do Bu parantezlerin içindeki kod grubunu uygula while (şartımız doğrulanıyorsa); -- geriye don ve tekrar uygula yukarıda açık şekilde görüldüğü üzere döngümüz "şartlarımız" ne olursa olsun "do" komutu ile başlayan döngümüzü bir kez işletecek ve "while" ile verilen satırdaki "şartlara" bakacaktır. Eğer şart "doğruysa" (true) geriye dönerek döngüyü ilk yaptığı şekilde "do" ile balyalayan yerden itibaren bir kez daha işletecektir. Hemen bir örnek verelim, do echo ("Kredi limitinizi aştığınız için son aldığınız ürün sepetinizden çıkarıldı"); $AlisverisToplami = $AlisverisToplami - $SonAlinanUrun; $SonAlinanUrun = $SonAlinanUrundenBirOncekiUrun; 71
while ($AlisverisToplami > $KrediLimiti); Yukarıdaki örnekte özellikle bir hata yapılmıştır. Hatamız kodlarla ilgili değil mantıkla ilgilidir. gördüğünüz gibi daha kullanıcını nin limiti aşıp aşmadığına bakmadan ekrana bir uyarı yazısını çıkarılmasıydı. Belki müşterimiz limiti aştı belki aşmadı. Ama bu şekilde "do while" döngüsü ile yazdığımız programlarda dikkatinizi çekmek istediğimiz nokta da işte buydu. Döngünün kontrol değişkeni döngü çalışmaya başladığı ilk seferden sonra kontrol edilir. Dolayısı ile her halükarda müşteri ekranda bu uyarıyı en az bir kere görecektir. Bu döngü yapısını o zaman nerede kullanacağız?şimdi size bu döngü yapılarının nasıl ve nerede kullanılacağını biraz açıklamaya çalısalım. Bir mantıksal örnekle başlayalım, do Bir sonraki kavşağa kadar arabayı sur; while ($Kavsak!= 10); Özet olarak eğer PHP'nin sizin için bir işlemi kesin olarak yapmasını ve aynı zamanda bir kontrol mekanizması ile donatılmasını istiyorsanız bu döngü tam sizin için yaratılmış demektir. Bir başka örnekle bu döngünün kullanımını pekiştirelim. şimdi girdiğimiz bir sayının "asal" sayı olup olmadığının araştırıldığı bir uygulama yazalım. 1. Text editörünüzü açın ve aşağıdakileri yazın. <HTML> <HEAD></HEAD> <BODY> <FORM METHOD = POST ACTION="asalsayı. php"> asalsayı olup olmadığını merak ettiğiniz rakamı giriniz: <INPUT NAME="Sayı" TYPE="Text"> <INPUT TYPE=SUBMIT VALUE = "Buraya tıklayarak sayının asal olup olmadığını öğrenin... "> </FORM> 72
</BODY> </HTML> 2. Bu dosyayı "asal. html" olarak kayıt edin. 3. Yeni bir text dosyası açıp aşağıdakileri yazın. <HTML> <HEAD></HEAD> <BODY> <?php $Bolunen = 2; do $Kalan = $Sayı%$Bolunen; $Bolunen = $Bolunen + 1; while ($Kalan!=0 AND $Bolunen<$Sayı); if (($Bolunen<$Sayı) ($Sayı ==0)) echo ("Sayınız asal bir sayı DEGIL"); else echo ("Sayınız ASAL bir sayıdır. ");?> </BODY> </HTML> 4. Bu dosyayı "asalsayı. php" olarak kayıt edin 5. "asalsayı. html" dosyasını açıp bir kez programı deneyin. Program nasıl çalışıyor İlk satırda $Bolunen değişkenini tanımladık. özellikle bu değişkeni 2 den başlattık çünkü bütün sayılar 1'e bölünebilir. 73
Programda $Kalan değişkeni ile,kullanıcının girdiği sayının döngü içerisinde o andaki karşılık gelen sayıya bölümünden kalan olup olmadığına bakıyoruz. Sonuçta bu işlemi "moda" operatörünü kullanarak yapıyoruz(% işareti PHP de "moda" almak için kullanılır. Kullanıcının web formundan girdiği sayı,teker teker 2 den başlayarak kendisine gelene kadar bütün sayılara bölünüyor. Mesela 263 un bir asal sayı olup olmadığına bakarsak,teker teker 2,3,4,5,6,7,8... sayılarına bölünüyor. Döngü her çalıştığında bir sonuç çıkıyor. Bu sonuç döngünün kontrol deyimi ile test ediliyor. Bu testten eğer "doğru" cevabi çıkarsa döngü tekrar çalışıyor ve bu böyle sürüp gidiyor. Eğer sayının kendisine gelindiyse ve halen matematiksel olarak kalan sıfıra eşit değilse bu demektir ki sayımız asal. "for" döngüleri for döngüleri belirli bir kod parçasının sizin istediğiniz sayı kadar tekrar edilmesini sağlar. Bir başka deyişle sizin istediğiniz sayı kadar, döngünün "iteration" yani iterasyon işlemine tabii tutulmasını sağlar. for (Sayacı Kur ; Sayacı Test Et ; Sayaca Ekle Veya Sayaçtan Çıkart) Bu parantezin içerisindeki kod grubunu uygula yukarıda sözü gecen "sayaç" kavramı ile döngünün kaç kez çalıştığını hesaplıyoruz. Bu "sayaç" ile aynı zamanda eğer belirlediğimiz sayı kadar cevrim gerçekleşmiş ise döngümüze son veriyoruz. Aslında "for" döngüsünde şartımız içerisinde tanımladığımız bu üç öğenin üçünü de kullanmak zorunda değiliz. Eğer bir satırda kendi ismimizi 10 defa yazdırmak istersek şimdiye kadar öğrendiğimiz bilgilerle bunu nasıl yaparız? $sayac = 0 while ($sayac<10) echo "Benim adım Metin!"; $sayac =$sayac+1 Yukarıdaki döngünün kaç defa çalıştığını tahmin edebilirimsisiniz? Sizce döngü 9 defa mı çalıştı?çünkü 10'a gelmeden döngü durdumu?acaba 11 kez mi çalıştı çünkü biz $Sayac ı 0 dan başlattık? 74
Evet 10 defa çalışmasını istediğimiz bir döngü için çok fazla soru değil mi?aslında yukarıdaki döngü tam olarak 10 defa çalışır. İste bu tip sorunları ortadan kaldırmak için en güzel yöntem "for" döngüleri kullanmaktır. Şimdi aynı işlemi birde "for" döngüsü kullanarak deneyelim, for ($sayac =1 ; $sayac<=10; $sayac++) echo "Benim adim Metin!"; gördüğünüz gibi döngünün kaç defa çalışacağı konusunda bir endişe duymanıza gerek yok. Hepsi sizin için $sayac ile vericeğiniz sayı kadar işletilecek. Bu döngü yapısını kullanırken örnek olarak sayacın kendisini de ekrana yazdırabilirdik, for ($sayac =1 ; $sayac<=10; $sayac++) echo $sayac; Çıktımız şöyle olacaktı. 12345678910 Not :Burada kullanılan "$sayac++" ifadesi "$sayac = $sayac + 1" ifadesi ile aynıdır. Yalnızca bir kısa yol olarak bu notasyon kullanılmıştır. Şimdi de bir uygulama yapalım. 1. Text editörünüzü açın ve aşağıdakileri yazın. <HTML> <HEAD></HEAD> <BODY> <FORM METHOD=POST ACTION="dinamik. php"> kaç tane çocuğunuz var? <INPUT NAME="Sayı" TYPE="TEXT"> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML> 75
2. Bu dosyayı "dinamik. html" olarak kayıt edin. 3. Yeni bir text dosyaysa açıp aşağıdakileri yazın. <HTML> <HEAD></HEAD> <BODY> <FORM METHOD=GET ACTION="dinamik2. php"> <?php for ($sayac=0 ; $sayac<$sayı ; $sayac++) $öteleme = $sayac + 1; echo "Lütfen $öteleme numaralı çocuğun adını giriniz : "; echo "<INPUT NAME=Çocuk [] TYPE=TEXT"; if ($sayac==0) echo "Lütfen bir tuşa basarak devam ediniz";?> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML> 4. Bu dosyayı "dinamik. php" olarak kayıt edin. 5. Yeni bir text dosyası açıp aşağıdakileri yazın. <HTML> <HEAD></HEAD> <BODY> <?php $sayac=0; echo "Çocuklarınızın isimleri :"; do echo "$Çocuk[$sayac]"; $Kontrol = "$Çocuk[$sayac]"; $sayac = $sayac + 1; while ($Kontrol!= ""); if ($sayac == 1) echo "Çocuk sayısı olarak sıfır girdiniz program sonlanıyor";?> </BODY> </HTML> 76
6. Bu dosyayı "dinamik2. php" olarak kayıt edin. 7. "dinamik. html" dosyasını açıp bir kaç kez programı farklı değerler vererek deneyin Diziler Diziler,bir tane değişken ismi altında verilerin indeks mantığı kullanılarak saklanmasıdır. Dizi'nin her üyesi bir element olarak tanımlanır. Dizileri de aynı değişkenlerde olduğu gibi yaratıyoruz. Bir değişkeni "dizi" şeklinde kullanacağımız zaman sadece köşeli parantezleri [ ] eklememiz ve gerisini PHP ye bırakmamız yeterlidir. Örnek vermek istersek, $Eyaletler[1] = "Washington"; $Eyaletler[2] = "Florida"; Dizi içerisinde yer alan elemanlara istediğiniz numarayı verebilirsiniz. $Eyaletler[39] = "Washington"; $Eyaletler[12] = "Alaka"; Dizileri bu şekilde "numara" vererek "indekslemek" yerine karakter guruplarda kullanabiliriz. $Eyaletler["l"] = "Florida"; $Eyaletler["il"] = "Illinois"; Eğer bu şekilde karakterler kullanarak dizinizi indeksliyorsanız dizinin içersinde saklanan veriye ulaşmak için çift tırnak işaretlerini kullanmayabilirsiniz, echo $Eyaletler["l"] = "Florida"; veya echo $Eyaletler[l] = "Florida"; aynı şeylerdir ve her ikiside problemsiz çalışacaktır. PHP'nin en güzel yanlarından bir tanesi de değişik tipteki verilerin bir dizide ortak olarak kullanılabilmesidir. 77
$Sayı[1] = 12; $Sayı[2] = "Oniks"; $Sayı[3] = $değişken; $Sayı["l"] = $değişken; Ancak bu gibi kullanımlarda diziye ayrılacak hafıza büyüklüğünün ne olması gerektiği gibi sorular nedeniyle PHP biraz yavaş çalışabilir!!! Dizilerin Başlatılması ve Kullanılması Bir diziyi başlatmak için adini yazıp köşeli parantezleri eklemek yeterlidir. İndeksleme problemleri gibi konularla bizim ilgilenmemize gerek yoktur. PHP tüm bu işlemleri otomatik olarak bizim için yapacaktır. Yalnızca dizinin ilk öğesini yaratın arkasından ikinciyi arkasından üçüncüyü... bu şekilde dizinin bütün öğelerini yaratabilirsiniz, $Yazar[] = "Metin Adaklı"; $Yazar[] = "Bilgin Girginer"; Köşeli parantezler olmadan PHP,ilk satırda değişkene verdiğiniz değeri ikinci satırda bir sonraki değer ile değiştirecektir. Bu köşeli parantezler sayesinde değerlerimizi bir dizi içerisinde saklamak istediğimizi PHP'ye anlatmış oluyoruz. Eğer indekslemeyi PHP ye bırakıyorsak dizinin ilk öğesi, $Yazar[0] = "Metin Adaklı"; ikinci öğesi, $Yazar[1] = "Bilgin Girginer"; olacak şekilde "sıfırdan" başlayarak dizinin tüm öğelerine birer numara atanır. PHP içerisinde diğer programlama dillerinden farklı olarak,dizinin içinde saklayacağımız veri tipini önceden bildirmemize gerek yoktur. Dizinin içerisinde yer alan elemanlarda text veya numara olarak veri saklanabilir. Yine değişkenlerde olduğu gibi PHP otomatik olarak onların veri tipine karar verecektir. İkinci önemli kolaylık diziyi yaratamadan önce ne kadar büyüklükte olacağına karar verme zorunluluğu olmaması. diğer programlama dillerinde bu iki şart dizilerle ilgili birçok kısıtlamayı beraberinde getiriyor. Php içerisinde dizilere veri girişi için iki yol bulunmaktadır. Birincisini zaten yukarıda ayrıntılı olarak açıkladık teker teker bütün dizinin elemanlarını girmek veya array () komutunu kullanmak. Şimdi bu komutun kullanımına bir örnek verelim, $Yazar = array ("Metin Adaklı","Bilgin Girginer"); 78
Tekrar edersek yukarıdaki örnek te PHP'ye diziyi otomatik olarak indekslemesi için özgür bıraktık. İndex değerleri "sıfırdan" başlayarak artan numaralar şeklindedir. Eğer "echo" komutuyla $Yazar[1] değişkeni içerisinde saklanan değeri görmek isteseydik ekranda "Bilgin Girginer" yazdığını görecektik. Dizilerin boyutunda herhangi bir sınırlama yoktur. Dolayısı ile şöyle bir kod yazabiliriz, $Eyaletler = array ("Alabama", "Alaka", "Arizona", "Arkansak", "California", "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"); Bizler yukarıda dizinin bütün öğelerini PHP'nin otomatik olarak indekslemesini sağladık. böyle bir kodu yazdığımız zaman PHP dizinin ilk öğesini (Alabama Eyaleti) "0" değeri ile indeksler. Amerika Birleşik Devletleri'nde toplam 50 eyalet vardır. gördüğünüz gibi son eyalet böyle bir dizide "49" değeri ile indeksleecektir. çünkü ilk değerimiz için indeks değeri "0"dır. Bu durumda dizinin belirli bir sayıdan başlayarak otomatik olarak indekslemesini istiyorsanız, $Eyaletler = array (1 => "Alabama", "Alaka", "Arizona", "Arkansak", "California", "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"); yukarıda görüldüğü şekilde "=>" operatörünü kullanmalısınız. Ardından gelen sayı dizimizin indekslemeye başlanacağı değerdir. Eğer çok uzun diziler kullanıyorsanız tabii ki dizinin her öğesi için bir indeks değeri belirleyebilirsiniz. $Eyaletler = array ("al" => "Alabama","ak" => "Alaka","az" => "Arizona","ar" => "Arkansak","ca" => "California","co" => "Colorado", "ct" => "Connecticut", "de" =>"Delaware","l" => "Florida","ga" => "Georgia", "hi" =>"Hawaii", "id" =>"Idaho","il" => "Illinois", "in" =>"Indiana", "ia" =>"Iowa", "ks" =>"Kansas", "ky" =>"Kentucky", "la" =>"Louisiana", "me" =>"Maine","md" => "Maryland","ma" => "Massachusetts","mi" => "Michigan", "mn" =>"Minnesota", "ms" =>"Mississippi","mo" => "Missouri", "mt" =>"Montana", "ne" =>"Nebraska","nv" => "Nevada", "nh" =>"New Hampshire", "nj" =>"New Jersey","nm" => "New Mexico","ny" => "New York","nc" => "North 79
Carolina","nd" => "North Dakota","oh" => "Ohio", "ok" =>"Oklahoma","or" => "Oregon", "pa" =>"Pennsylvania","ri" => "Rhode Island", "sc" =>"South Carolina","sd" => "South Dakota","tn" => "Tennessee","tx" => "Texas", "ut" =>"Utah","vt" => "Vermont","va" => "Virginia","wa" => "Washington","wv" => "West Virginia", "wi" =>"Wisconsin","wy" => "Wyoming"); Dizi Boyunca İterasyon (Iterating Through an Array ) Diziyi bir kere yarattıktan sonra her seferinde geriye donup teker teker onları çağırmaya gerek yoktur. Eğer yukarıda yaratılan "eyaletler" dizisinin bütün elemanlarını web sayfasında görüntülemek isteseydik üç satırlık kod ile bu işi çözümlemiş olacaktık. for ($sayac=1;$sayac<51;$sayac++) echo "$Eyaletler[$sayac]"; döngümüz 1 den başlayarak 50 ye kadar sayacak ve her dönüşünde Amerikanın bir eyaletini ekrana yazacaktır. Not : "" bir HTML tagıdır ve her seferinde yeni bir satır yaratmak amacıyla kullanılmıştır. Döngünün çalışmasını açık şekilde yazacak olursak, echo "$Eyaletler[1]"; echo "$Eyaletler[2]"; echo "$Eyaletler[3]"; echo "$Eyaletler[4]";............. Aynı amaca ulaşmak için "while" döngüsünü kullanmak isteseydik bir kaç satır fazla kod yazacaktık, $sayac=1; while ($sayac<51) echo "$Eyaletler[$sayac]"; $sayac=$sayac+1; Şimdi de bir uygulama yazalım. 1. Text editörünüzü açın ve aşağıdakileri yazın. <HTML> <HEAD></HEAD> 80
<BODY> <FORM ACTION="başkentler. php" METHOD=POST> Hangi eyaletin başkentini öğrenmek istiyorsunuz? <SELECT NAME=Eyalet> <?php $Eyaletler = array (1 => "Alabama", "Alaka", "Arizona", "Arkansak", "California", "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"); for ($sayac=1;$sayac<51;$sayac++) echo "<OPTION>$Eyaletler[$sayac]</OPTION>"; echo "</SELECT>"; for ($sayac=1;$sayac<51;$sayac++) echo "<INPUT TYPE = HIDDEN NAME='GizliEyalet[]' VALUE = '$Eyaletler[$sayac]'>"; echo "<INPUT TYPE=SUBMIT></FORM>";?> </BODY> </HTML> 2. Bu dosyayı "eyaletler. php" olarak Kayı edin. 3. Yeni bir text dosyası açıp aşağıdakileri yazın. <HTML> <HEAD></HEAD> <BODY> <?php $EyaletBaskenti = array (0 => "Montgomery", "Juneau", "Phoenix", "Little Rock", "Sacramento","Denver","Hartford", "Dover","Tallahasse", "Atlanta", "Honolulu", "Boise", "Springfield","Indianapolis", "Des Moines", "Topeka", "Frankfort", "Baton Rouge","Augusta","Annapolis","Boston", "Lansing", "Saint Paul","Jackson", "Jefferson City", "Helena","Lincoln", "Carson City","Concord", "Trenton","Santa Fe", "Albany", "Raleigh","Bismarck","Columbus","Oklahoma City", "Salem", "Harrisburg", 81
"Providence", "Columbia","Pierre", "Nashville", "Austin","Salt Lake City", "Montpelier","Richmond","Olympia","Charleston", "Madison","Cheyenne"); for ($sayac=0;$sayac<50;$sayac++) if ($GizliEyalet[$sayac] == $Eyalet) echo "Sectiginiz eyaletin baskenti $EyaletBaskenti[$sayac]";?> </BODY> </HTML> 4. Bu dosyayı "başkentler. php" olarak kaydedin. 5. "eyaletler. php" dosyasını açıp bir deneme yapın. Sıralı olmayan indeks yapılı dizilerin İterasyonu Diziyi düzgün olarak sıraladığınız (indekslediğiniz) zaman çoğu işlemi yapmak gerçekten kolay olacaktır. Birde aşağıdaki gibi bir diziye sahip olduğumuzu varsayalım, $Dizimiz[3569]="gerçekten büyük"; $Dizimiz[1]="Gerçekten küçük"; $Dizimiz[599]="normal bir sayı"; Şimdi PHP'nin bize dizilerle ilgili sunduğu fonksiyonları öğrenerek belirli kalıplara bağlı kalmaktan kurtulup her türlü dizi işlemini gerçekleştirebileceğiz. current ve key fonksiyonları Dizi içerisinde hangi elementin o anda kullanıldığını görmek için current (), bu elementin indeks değerini bulmak isterseniz key () fonksiyonunu kullanmalısınız. Hemen çok küçük bir kod parçası üzerinde PHP'nin yeni eklediğimiz dizi elementlerine hangi indeksi otomatik olarak verdiğini görelim. $Yonetmen[4]="Yılmaz Güneş"; $Yonetmen[1]="Clint Eastwood"; $Yonetmen[93]="Steven Spielberg"; $Yonetmen[24]="Al Pacino"; 82
aşağıdaki iki satır kodu eklersek "$Yönetmen[]" dizisi için o anki geçerli indeks değerini görebiliriz. $İndeksDeğeri = key($yonetmen); echo ($IndeksDegeri); böyle bir programın çıktısında "key ()" fonksiyonu "4" değerini döndürecek ve echo komutuyla ekrana yazılacaktır. gördüğünüz gibi o anda geçerli olan indeks değeri dizinin ilk elemanını bize gösterdi. Eğer current () fonksiyonunu kullanmış olsaydık döndüreceği değer "Yılmaz Güneş" olacaktı. $GecerliIcerik = current ($Yonetmen); echo ($GecerliIcerik); Şimdide bir satır daha ekleyelim dizimize ve bakalım PHP hangi indeksi verecek bu yeni eklenen dizi elementine, $Yonetmen[] = "Mel Gibson"; "Mel Gibson" indeks değeri "94" olarak dizimiz içerisinde yer alacaktı. current () ve key () fonksiyonlarını kullanarak,dizi içerisinde ekleyeceğimiz bir sonraki elemente hangi indeks değerinin verileceğini nasıl bulabiliriz?yazımızı okumaya devam edin. Next () ve Prev () Diziye eklenen yeni elemanların indeks değerini bulmak için next () ve prev () fonksiyonlarını kullanabilirsiniz. Bu fonksiyonlar dizi boyunca elementler arasında dolaşmanızı sağlarlar. Bu iki fonksiyonda,argument olarak dizi ismini alırlar. Yani hangi fonksiyonun elementleri arasında gezinmek istiyorsanız fonksiyonu,o dizinin adını vererek kullanmalısınız. Şimdi bir önceki konuda yarattığımız diziyi ele alalım ve bu fonksiyonları uygulamalı olarak görelim, $Yönetmen[4]="Yılmaz Güneş"; $Yönetmen[1]="Clint Eastwood"; $Yönetmen[93]="Steven Spielberg"; $Yönetmen[24]="Al Pacino"; $Yönetmen[] = "Mel Gibson"; next ($Yonetmen); $İndeksDeğeri = key($yonetmen); echo ($İndeksDeğeri); 83
Bu küçük programımızın çıktısı "1" olacaktır. Çünkü next fonksiyonu çağrılmadan önce current elementin indeks değeri "4" tü. Yani dizinin ilk elemanıydı. Biz next ($Yonetmen); diyerek dizi içerisindeki bir sonraki elementi kullanıma hazır hale getirdik. Sonrasında $İndeksDeğeri değişkeni içerisinde key($yonetmen) fonksiyonu ile verdiğimiz değerin saklanmasını sağladık. echo ($İndeksDeğeri) komutu ile de ekrana yazdırdık. next ($Yonetmen); next ($Yonetmen); next ($Yonetmen); next ($Yonetmen); $İndeksDeğeri = key($yonetmen); echo ($İndeksDeğeri); Gördüğünüz gibi fonksiyonu üç defa daha kullandık şimdi artık echo komutu ile ekrandan alacağımız çıktı "94" olacaktır. Eğer bu indeks numaralı elementin içeriğini ekranda yazdırmak isteseydik, $GecerliIcerik = current ($Yonetmen); echo ($GecerliIcerik); "Mel Gibson" çıktısını alacaktık. prev () fonksiyonun kullanımı da tamamen yukarıdaki ile aynıdır. Bu fonksiyonla dizi içerindeki elementler arasında "geriye" doğru gezinmemizi sağlıyoruz. next ($Yonetmen); next ($Yonetmen); next ($Yonetmen); next ($Yonetmen); prev ($Yonetmen); $İndeksDeğeri = key($yonetmen); echo ($İndeksDeğeri); Kod grubunun çıktısı "24" olacaktır. Dizi içerisinde önce dört element ileriye doğru gidip o elementin "current" olmasını sağladık. Sonra prev ($Yonetmen); satırı ile dizi içerisinde bir element geriye gittik. Diğer satırlarda ise işte o elementin "indeks" değerini ekrana yazdırdık. Şimdi burada bir konuyu belirtelim. Eğer dizimiz içerisinde mesela ikinci "next" satırında dizimizin sonuna gelmiş olsaydık ne olacaktı. Ondan sonraki kodlar hata uyarısı verecekmiydi? Bu sorunun cevabi kesinlikle HAYIR DIR. Böyle bir durumda hiç bir şey olmayacaktı. Kodumuz hiç bir hata vermeyeceği gibi hiç bir değerde döndürmeyecekti. Başka programlama dillerinde bu durumdaki bir program mutlak hata döndürür. 84
prev ($Yonetmen); next ($Yonetmen); next ($Yonetmen); $İndeksDeğeri = key($yonetmen); echo ($İndeksDeğeri); Kod grubu da aynı şekilde hata döndürmeyecektir. gördüğünüz gibi daha dizinin başında dizideki elementi bir geriye almak istedik. list ve each fonksiyonları Bu iki fonksiyonla dizimiz içerisinde yalnızca "veri içeren" element'lerin kullanımını sağlıyoruz. Bir döngümüz içerisinde mesela "boş" içeriğe sahip elementlerin kullanılmasını istemiyor olabiliriz. Bu durumda dizi içerisindeki bütün veri içeren elementleri çok kolayca ekranda gösterebiliriz. Mesela "while" döngüsü için aşağıdaki kodu yazabiliriz, while (list(indeksdeğerimiz,elementinicerigi) = each (DizininAdi) yukarıdaki satır diyor ki : DizininAdi ile verilen dizi adındaki her bir elementin "indeks" değerini İndeksDeğerimiz'e, içeriğini de ElementinIcerigi'ne eşitle. Eğer yalnızca indeks değerinin veya içeriğinin döndürülmesini istiyorsanız, while (list(indeksdeğerimiz) = each (DizininAdi) veya while (list(,elementinicerigi) = each (DizininAdi) Örneğimizle verilen küçük kod parçası üzerinde uygulamalı olarak gösterirsek, while (list($indeksdeğeri,$gecerliicerik) = each ($Yonetmen)) echo "$İndeksDeğeri - $GecerliIcerik"; String indeks yapılı dizilerin İterasyonu Karakterler ile indekslenmis dizilerin elementleri arasında dolaşmak, yukarıda açıklanan numara ile indekslenmis diziler arasında dolaşmak ile aynıdır. Biç kaç fark bulunmaktadır tabii ki ama mantık hepsinde aynıdır. Şimdi bir kod parçası üzerinde farklılıkları anlatalım. 85
$EyaletBaskenti["ga"]="Atlanta"; $EyaletBaskenti["il"]="Springfield"; $EyaletBaskenti["ca"]="Sacramento"; $EyaletBaskenti[]="Cheyene"; "Cheyene" ile verilen değer dizi içerisinde $EyaletBaskenti[0] öğesi olarak saklanacaktır. gördüğünüz gibi indeks değeri "0" dir. PHP'nin dizinin bu öğesi hakkında herhangi bir bilgiye sahip değildir ve indeks olarak sıfır değerini ataması çok da sürpriz değildir. Eğer herhangi bir elemente numara vererek indekslemiş olsaydık ondan sonra gelecek ilk sayının numarası bu indeksi verilmeyen elemente atanacaktı. Şu anda dizide numara ile indekslenmis bir değer olmadığı için sıfır verilerek bu element indeksdendi. current () ve key () fonksiyonları yine aynı şekilde kullanılacaktır. Herhangi bir fark yoktur. $HangiEyalet = current ($EyaletBaskenti); $HangiKisaltma = key ($EyaletBaskenti0; echo "$HangiEyalet - $HangiKisaltma"; Bu kodun çalıştırılması halinde "Atlanta - gaf" şeklinde bir çıktıyı ekrandan alırsınız next () ve prev () fonksiyonları yine aynı şekilde kullanılacaktır. Herhangi bir fark yoktur. $EyaletBaskenti["gaf"]="Atlanta"; $EyaletBaskenti["il"]="Springfield"; $EyaletBaskenti["ca"]="Sacramento"; $EyaletBaskenti[]="Cheyene"; next ($EyaletBaskenti); $HangiEyalet = current ($EyaletBaskenti); $HangiKisaltma = key ($EyaletBaskenti0; echo "$HangiEyalet - $HangiKisaltma"; Bu kodun çalıştırılması halinde "Springfield -il" şeklinde bir çıktıyı ekrandan alırsınız array () fonksiyonuca yine aynı şekilde kullanılacaktır. Herhangi bir fark yoktur. $EyaletBaskenti = array ("gaf" => "Atlanta","il" => "Springfield","ca" => "Sacramento", "wy" => "Cheyene"); list () ve each () fonksiyonları yine aynı şekilde kullanılacaktır. Herhangi bir fark yoktur. while (list($eyaletkisaltmasi,$eyaletismi) = each ($EyaletBaskenti)) 86
echo "$EyaletKisaltmasi - $EyaletIsmi"; Not : yukarıda kullanılan $EyaletKisaltmasi,$EyaletIsmi değişkenleri yerine istediğiniz bir değişken ismi yazabilirsiniz. Burada önemli olan "each" ile verilen $EyaletBaskenti dizisinin adidir. Yani, while (list($metinmakinecidir,$ozgurhiyarielektronikcidir) = each ($EyaletBaskenti)) echo "$MetinMakinecidir - $OzgurHiyariElektronikcidir"; yazmak tamamen aynı şeylerdir her ikisizinde çıktısı şöyle olacaktır. gaf - Atlanta il - Springfield ca - Sacramento wy - Cheyene Dizilerin Sıralanması Dizilerin sıralanması için PHP içerisinde birçok fonksiyon bulunmaktadır. Bizler bunların arasından en çok kullanılan 5 tanesini inceleyeceğiz. Burada anlatılan fonksiyonlar genel olarak kullanılmaktadır. sort () En temel sıralama fonksiyonudur. Dizinin içerisindeki elementleri içeriklerine göre alfabetik olarak sıralar. Argument olarak sıralanacak dizi isminin verilmesi yeterlidir. sort (DizininAdi) Örnek vermek istersek, $Yonetmen = array ("Orson Welles","Carol Reed","Fritz Lang","Jacques Tourner"); Yönetmenlerimizin isimlerinin yer aldığı böyle bir diziyi siralamak istersek, sort ($Yonetmen); yazmamiz yeterli olacaktı. 87
Bu işlemin sonucunu ekranda görmek için yine list () ve each () fonksiyonlarını kullanabiliriz. $Yonetmen[0]= "Orson Welles" $Yonetmen[1]= "Carol Reed" $Yonetmen[2]= "Fritz Lang" $Yonetmen[3]= "Jacques Tourner" siralamadan sonra, $Yonetmen[0]= "Carol Reed" $Yonetmen[1]= "Fritz Lang" $Yonetmen[2]= "Jacques Tourner" $Yonetmen[3]= "Orson Welles" olacaktır. Peki dizimizi böyle numaralar ile indekslemek yerine karakterler kullanarak indekslemiş olsaydık (yani harf gurupları kullanarak indeksleseydik)? asort () Karakterler ile indekslenmiş dizileri elementlerinin içeriklerine göre sıralamak için kullanılır Şimdi eyaletler dizimizi ele alalım, $EyaletBaskenti = array ("gaf" => "Atlanta","il" => "Springfield","ca" => "Sacramento", "wy" => "Cheyene"); Dizimiz böyle bir kodun ardından doğal olarak aşağıdaki gibi yaratılacaktır $EyaletBaskenti["gaf"]= "Atlanta"; $EyaletBaskenti["il"]= "Springfield"; $EyaletBaskenti["ca"]= "Sacramento"; $EyaletBaskenti["wy"]= "Cheyene"; eğer sort () kullanarak sıralamış olsaydık son durum şöyle olacaktı, $EyaletBaskenti[0]= "Atlanta"; $EyaletBaskenti[1]= "Cheyene"; $EyaletBaskenti[2]= "Sacramento"; $EyaletBaskenti[3]= "Springfield"; diğer bir deyişle harfler kullanarak indekslediğiniz dizimizde,bu harfler numaralarla değiştirilecekti. Bunu engellemek için mutlaka asort () kullanılmalıdır, 88
asort ($EyaletBaskenti); komutunu verdikten sonra artık dizimiz aşağıdaki şekilde sıralanacaktır. $EyaletBaskenti["gaf"]= "Atlanta"; $EyaletBaskenti["wy"]= "Cheyene"; $EyaletBaskenti["ca"]= "Sacramento"; $EyaletBaskenti["il"]= "Springfield"; ekranda sıralamanın nasıl değiştiğini görmek için tabii ki list () ve each () fonksiyonlarını "while" döngüsü ile şu şekilde kullanabilirsiniz, while (list($eyaletkisaltmasi,$eyaletismi) = each ($EyaletBaskenti)) echo "$EyaletKisaltmasi - $EyaletIsmi"; rsort () ve arsort() fonksiyonları Bu iki fonksiyonda amaç olarak sort () ve asort () fonksiyonlarına benzerdir. Tek farkı dizi elementlerinin içeriklerini alfabenin tersi yönünde sıralamalarıdır. $Yonetmen = array ("Orson Welles","Carol Reed","Fritz Lang","Jacques Tourner"); rsort ($Yonetmen); ve aynı şekilde kareketer kullanılarak yaratılmış diziler içinde, $EyaletBaskenti = array ("gaf" => "Atlanta","il" => "Springfield","ca" => "Sacramento", "wy" => "Cheyene"); arsort ($EyaletBaskenti); ksort () Karakter dizisi kullanılarak yaratılmış diziler için,"indeksleri" kullanarak alfabetik olarak sıralama yapar, $EyaletBaskenti = array ("gaf" => "Atlanta","il" => "Springfield","ca" => "Sacramento", "wy" => "Cheyene"); ksort ($EyaletBaskenti); kodumuzun sonunda dizimiz şu şekilde sıralanacaktır, $EyaletBaskenti["ca"]= "Sacramento"; $EyaletBaskenti["gaf"]= "Atlanta"; $EyaletBaskenti["il"]= "Springfield"; $EyaletBaskenti["wy"]= "Cheyene"; 89
Çok boyutlu dizilerle çalışmak : C ve Java dillerinde,birden fazla boyuta sahip dizi tanımlamak gerçekten de ileri seviye uzmanlık gerektiren kavramlardır. PHP de ise bu konu için kısaca tanımlanabilecek ve uygulanabilecek yazım kuralları geliştirilmiştir. Bir diziye istediğiniz kadar çok boyut katabilirsiniz. PHP içinde bir diziyi kullanırken ona iki'den fazla boyut katmak,çok ta güzel bir programcılık tekniği değildir. Bu hem sizin hem de PHP nin yapısı itibari ile bir çok ekstra yükü beraberinde getirir. Sizin için, kodun sonradan başka kişiler tarafından bakımının zorlaşması,sunucu için ise kaynaklarının yok edilmesi bakımından önemli ve düşünülmesi gereken,ve hatta mümkünse iki den fazla boyut için kaçınılması gereken programlama teknikleridir... Örnek: <?php $örnek_dizi = array("ambalajlar" => array("kagit","plastik"),"urunler" => array("et", array("süt","yumurta"))); print $örnek_dizi["ambalajlar"][1]; //ekrana plastik yazdirdim... print $örnek_dizi["urunler"][2][1]; //ekrana süt yazdirdim...?> Bir diziyi sizin belirlediğiniz bir fonksiyona göre sıralamak : Bir diziyi kendi belirlediğiniz kurala göre sıralamak istiyorsunuz. Buna sebep PHP'nin hazır sıralama fonksiyonlarının yetersizliği olabilir. Çözüm : asort () fonksiyonu, kullanıcı tanımlı bir fonksiyona göre bir diziyi sıralayabilir. Örnek : <?php function borcu_sirala ($a,$b) if ($a[1]==$b[1]) return 0; return ($b[1] > $a[1])? 1 : -1; /* Diyelim ki arkadaşlarınızın size olan borcunu bir dizide 90
saklıyorsunuz ve bu diziyi en büyük borçtan en küçüğe doğru sıralamak istiyorsunuz. */ $aborclar = array(array("okan",31),array("aos",12),array("kris",18)); asort ($aborclar,'borcu_sirala'); foreach ($aborclar as $borc) print $borc[0]. " isimli kişinin bana olan borcu :". $borc[1]; print "<br>";?> Açıklama : asort () fonksiyonu argument olarak bir dizi ve kullanıcı tanımlı bir fonksiyonun ismini alır. İlk argumentte aldığı diziyi,ikinci argumentte yer alan fonksiyona göre sıralar. Bu kullanıcı tanımlı fonksiyon mutlaka "-1,0 veya 1" sonuçlarından birini döndürmelidir. PHP'nin yapısal sıralama fonksiyonları "dizilerin dizilerini" sıralayamazlar. Ancak yukarıdaki şekilde yapılandırılmış dizileri "asort ()" ile kendi yazdığınız fonksiyonlarla sıralayabilirsiniz. Karakter indeksli dizilerden element silmek: Problem : Karakter indeksli dizilerden istediğiniz elementleri silmek istiyorsunuz. Çözüm: PHP ile beraber gelen unset () fonksiyonunu kullanabilirisiniz. Tartışma : unset () fonksiyonu ile verilen değişken hafızadan silinir (yok edilir). Bu fonksiyonu bir tek değişkeni silmek için kullanabileceğiniz gibi bir değişken listesi tanımlayıp hepsini berberce de silebilirsiniz. Diziler için kullanıldığında (dizilerde bir değişkendir sonuçta) verilen indeks ve o indekse ait değeri, yani dizinin o elementini tamamen diziden siler. Hafızanın o elemente ayrılmış bölgesi tamamen temizlenir. Bir örnekle incelemek istersek : <?php $evler = array ("Hillsborough" => array("metin","esra"), "Mersin" => array("annem","babam","kardeşlerim"),"istanbul" => array ("Ablam","Eniştem","Bebekleri")); 91
ekrana_yazdir ($evler); print ""; print "Şimdi de listeden bazı elementleri siliyorum ve fonksiyonu yine çağırıyorum... "; unset ($evler[hillsborough], $evler[istanbul]); ekrana_yazdir ($evler); function ekrana_yazdir ($ar) foreach ($ar as $YasadigiYer => $Insanlar) print "$YasadigiYer: "; foreach ($Insanlar as $kişiler) print "$kişiler "; print "\n";?> Böylece hem çok boyutlu dizilerle çalışmaya örnek vermiş hem de bir diziden nasıl element silebileceğimizi öğrenmiş olduk... 92
Kaynaklar 1- İnternet siteleri 2- www.php.net 3- www.turk-php.com 93