Tek İleti Göster
Eski 06.06.2007   #1 (permalink)
staticiation
 
Katılma Tarihi: Şub 2006
Nereden: Bursa/es-es
Yaş: 23
Mesajlar: 1,780
Varsayılan Php de Döngüler ve Diziler...

Donguler,yazdigimiz komutlarla istedigimiz bir islemi bilgisyarin yuzlerce,binlerce,ve hatta milyonlarca defa tekrarlamasidir.Biraz aciklamak istersek,eger bilgisayara bir gorevi yapmasi icin emir veriyorsak ve bilgisyar bu emri basarili bir sekilde yerine getiriyorsa neden ayni islemi dogru olarak bizim istedigimiz sayi kadar veya istedigimiz sartlar yerine gelene kadar tekrarlamasin ki?



PHP iserisinde her programlama dilinde oldugu gibi bu konu icin yazim mekanizmalari gelistirlmistir.Burada ogreneceginiz dongu yapilari size diger programlama dillerini ogrenirken de gorus olarak yardimci olacaktir.



Bu bolumde asagidaki konular icin detayli aciklamalar bulacaksiniz,





"while" dongusu, (The while loop)

"do while" dongusu ,

"for" dongusu,

Dizilerin yaratilmasi (Creating Arrays)

Dizilerden deger okunmasi

Dizilerin Indexlenmesi

Dizilerin Siralanmasi

Cok Boyutlu Diziler

Dongu ve Diziler icin pratik ornekler


Donguler



Bir onceki konuda formlar uzerinde yapilan kontrol islemleri anlatilmisti.Bu form kontrollerinde istedigimiz sartlara gore form verilerinin islenip islenmemesi gerektigine,PHP yazdigimiz "if" komutlari ile karar veriyordu.(Eger halen okumadiysaniz IF serisi yazilarimizi bastan sona okuyarak bilgi alabilirsiniz)



Dongulerde durum biraz daha degisik cunku,PHP bizim yazdigimiz sartlar olusuncaya kadar ,dongu icerisinde verilen kod grubunu calistiracaktir.Dongunun yaptigi bu herbir isleme "iteration" yani "oteleme" adi verilir.Dongunun herbir donusu bizim icin bir "iteration" dir.



while donguleri



Ilk anlatacagimiz dongu yapimiz "while".Bunun sebebi yapi olarak en basit olan dongunun "while" olmasidir.







while (sartimiz dogruysa)



{



Bu parantezlerin icersindeki kod grubunu uygula



}




Parantezlerin icerisindeki kod grubu uygulandiktan sonra eger dongumuzun en basinda verdigimiz sart halen dogrulaniyorsa,dongumuz bir kez daha calisacaktir.Bu dongu taa ki bizim dongumuzun basinda verdigimiz sart "yanlis" degerini dondurene kadar devam edecektir.







while (ay dolunay)



{



Kurtlar Uluyacak



}







yukaridaki ornekte goruldugu gibi Ay'in durumu dolunay oldugu surece kurtlarimiz uluyacak yani dongumuz calisacak )



Bir baska ornek verecek olursak ,uygulamamiz icerisinde kullanicinin kredi karti limitini asmasi durumunda "sepet"'inden bazi urunleri cikarmak istiyoruz.Asagida bununla ilgili bir kod parcasi gorulmektedir.



While ($AlisverisToplami > $KrediLimiti)



{



echo ("Kredi limitinizi astiginiz icin son aldiginiz urun sepetinizden cikarildi");



$AlisverisToplami = $AlisverisToplami - $SonAlisveris;



$SonAlisveris = $SonAldigiUrun;



}



Eger musteri kredi limitini asarsa ,son aldigi urunu iptal ediyoruz.Bunu, toplam faturasindan urunun fiyatini duserek yapiyoruz.Daha sonra $SonAlisveris degiskeni icerisinde saklanan degeri $SonAldigiUrun degiskeni ile degistirip her seferinde dongumuzde,eger kredi limiti asiliyorsa kullanicinin aldigi son urunleri birer birer spetinden cikartmis oluyoruz.



Burada dikkat edilmesi gereken nokta eger $KrediLimiti olarak verilen deger negatif olursa dongumuzun asla son bulmayacagidir.Her zaman eger dongulerle calisiyorsaniz aklinizda olmasi gereken nokta dongunun verilen degisik degerler karsisinda ne yapacagini hesaplamanizdir.(Sonsuz donguler ile ilgili aciklamayi yazinin ileryen kesimlerinde bulabilirsiniz)



Simdi yukarida acikladigimiz "while loops" yani "while donguleri" icin bir uygulama yazalim.



1.Text editorunuzu acip asagidaki kodlari yazin.



<HTML>
<HEAD></HEAD>
<BODY>
Seres Bankasi Kredi Isteme Formu



<FORM METHOD=POST ACTION="kredi3.php"
<BR>
Ne kadar kredi almak istiyorsunuz?
<BR>
<BR>
<INPUT NAME="Kredi" TYPE="Radio" VALUE=1000>Kredi miktari 1000 TL Faiz %5
<BR>
<INPUT NAME="Kredi" TYPE="Radio" VALUE=5000>Kredi miktari 5000 TL Faiz %10
<BR>
<INPUT NAME="Kredi" TYPE="Radio" VALUE=10000>Kredi miktari 10000 TL Faiz %15



<BR>
<BR>



Aylik ne kadar geri odeme yapabilirsiniz?
<INPUT NAME="AylikOdeme" TYPE=Text SIZE=5>



<BR>
<BR>



<INPUT TYPE=SUBMIT VALUE="Buraya Tiklayarak Geri Odeme icin Kac Ay Gerektigini Hesaplayin">



</FORM>
</BODY>
</HTML>



2.Bu dosyayi "kredi3.html" olarak kayit edin.
3.Yeni bir text dosyaysi acip asagidaki kodlari yazin.



<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 secmelisiniz!";
exit;
}
while ($Kredi > 0)
{
$Sure = $Sure + 1;
$AylikNet = $AylikOdeme - ($Kredi*$Faiz/100);
if ($AylikNet<=0)
{
echo "Daha yuksek bir odeme miktari secmelisiniz!";
exit;
}
$Kredi = $Kredi - $AylikNet;
}
echo "Toplam $Sure ayda yuzde $Faiz faiz ile kredinin tamamini odemis olacaksiniz.";
?>
</BODY>
</HTML>






4.Bu dosyayi "kredi3.php" olarak kayit edin.



5."kredi3.html" dosyasini acin ve bir kac veri girin.



Ornek Dosyalar



http://www.turk-php.com/ornekler/kredi3.html



http://www.turk-php.com/ornekler/kredi3.php



Program nasil calisiyor?



Formdan gelen veriler yazdigimiz PHP programina ulastiginda su verileri kesin olarak biliyoruz,(Kullanici kisi forma bu verileri kendisi girdi.)



$Kredi
$Faiz
$AylikOdeme



Simdi ilk yaptigimiz islem kullanicin sectigi pakete gore faiz orani ve kredi miktarini programda tanimlamak.



Bunun icin "switch" komutunu kullanarak elimizde bulunan butun kosullari programin icinde tanimliyoruz..



$Kredi degiskenin alabilecegi 3 tane deger vardir.Bunlar 100,5000,ve 10000 dir.Biz bu degerleri kulllanarak program icinde $Faiz degiskeni icinde bir atama yapilmasini sagliyoruz.Bunu hangi kredi miktarini kullanici secmis ise "switch" ile tanimlarken bir alttaki satirda $Faiz degiskenine deger atayarak yapiyoruz.



$AylikOdeme miktarini da zaten kullanicimiz en basta bizim icin text alanina girmisti.



Bu noktadan sonra artik "while" dongumuzu kullanarak kisinin bu aldigi krediyi kac ayda tam olarak geri odeyebilcegini hesaplayabiliriz.



While ($Kredi >0)
{



Bu ifade ile dongumuzu baslatiyoruz.Kredi miktarimiz mutlaka sifirdan buyuk olmalidir.Zaten $Kredi degiskenimizin alabilcegi 3 tane deger var ve bunlar sifirdan farkli.o yuzden sorun cikmasi ihtimali yok.



Bir sonraki satirda programi yazmamizin amaci olan kac ayda odeyebilecegi sorusuna cevap verecek $Sure sayacimizi tanimliyoruz.Dongumuz her calistiginda bu sayac birer birer artacak.Bu degisken icerisinde ,boylece dongu sonunclaninca dongunun kac defa calistigi yani aylik odemelerin kac ayda tamamlanacagi degeri bu degiskende saklanmis olacak.Dongu mesela iki defa calisip biterse demek ki kullanici 2 ayda tum krediyi geri odemis olacak.



$Sure = $Sure + 1;



Bir alttaki satirda aylik odemelrin ne kadar olacagi hesaplaniyor.Bu deger tabiiki faiz miktari dusuldukten sonra olmalidir.Cunku kullanicinin odedigi paranin belli miktarini faize gidecek.Eger faiz hic isin icinde olmasaydi tabii ki kullanicidan gelen butun parayi ($AylikOdeme) gozununde bulundurup faiz kismini isin icine katmayacaktik.Faize giden parayi sanki kullanici hic odememis gibi dusunebilirsiniz.



$AylikNet = $AylikOdeme - ($Kredi * $Faiz/100);



yukarida gordugunuz gibi $Kredi ile $Faiz orani carpilip yuzdesi alinmakta.Bu miktari kullanicin aylik odemesinde dusmekteyiz.bu sekilde net olarak kullanicidan gelen net miktari hesapliyoruz.



Bir sonraki satirda ,



if (AylikNet <= 0)



{



echo "Aylik odeme miktarini biraz daha yuksek secmelisiniz";
exit;



}






Kod grubu ile ,kullanicidan gelen miktar eger faizi bile karsilamaya yetmiyorsa programin yapacagi islem tanimlaniyor.Eger boyle durum olursa "exit" komutu ile program sonlaniyor.(Tabii ki sonlanmadan once bir bilgi mesji ekrana gordugunuz gibi "echo" komutuyla basiliyor. )






Bir sonraki,



$Kredi = $Kredi - $AylikNet;



kod satirinda kullanicin aldigi kredi miktarindan ,odedigi miktar dusulurek yeni deger yine $Kredi degiskeninde saklaniyor.



Boylece dongumuzun bir defalik cevrim surecini aciklamis olduk.Dongumuz tum bu islemleri ,






While ($Kredi >0)



sartimiz "false" oluncaya kadar tekrarlayacaktir.Gordugunuz gibi dongunun her calismasinda $Kredi degiskeni icerisinde saklanan deger yavas yavas azalmaktadir.



(Cunku dongu her calsitiginda $Kredi = $Kredi - $AylikNet; formulu ile $Kredi degiskenin degerini dusurmektedir)



Simdi bir de sayisal ornek vererek dongunun nasil calistigini aciklayalim.



Ornek olarak kullanicin 1000 dolarlik krediyi yuzde 5 faiz ile aldigini kabul edelim.Kullanicimiz aylik 100 dolar odeyebilcegini soyluyor.O zaman degiskenlerin degerleri asagidaki gibi olacaktir.



$Kredi = 1000
$Faiz = 5
$Sure = 0
$AylikOdeme = 100



Dongumuzun en basinda ,



Kullanicinin aldigi Kredi 1000 dolar,Faiz orani 5, Aylik,Odeme 100 ve Sure 0 olacaktir.



Simdi programin ilk satiri soyle olacaktir,



while (1000>0)



Evet 1000 sayisi 0 sayisindan buyuk rahatlikla dongunun icerisndeki islemler uygulanabilir.



$Sure = 0 + 1;



Simdi $Sure degiskenimiz 1 e esit.



Bir sonraki satir,



$AylikNet = 100 - (1000*5/100);



$AylikNet = 100 - 50;



artik $AylikNet degiskenimiz 50'ye esit.



Son satirda bu degeri yerine koyuyoruz
$Kredi = 1000 - 50;



Artik $Kredi degiskenimiz 950 dir.Program en basa donerek bu degeri kontrol degeri ile karsilastiracaktir.



While (950>0)



Evet 950 sayisi 0 sayisindan buyuk rahatlikla dongunun icerisndeki islemler tekrar uygulanabilir.



$Sure = 1 + 1;



artik $Sure degiskenimiz 2 ye esit.



$AylikNet = 100 - (950*5/100);



Artik $AylikNet degiskenimiz 52.5 e esittir.



$Kredi = 950 - 52.5;



Artik $Kredi degiskenimiz 897.5 e esittir.






While (897.5>0)



Evet 897.5 buyuktur 0 dan diyerek ayni sekilde dongu taa ki $Kredi degeri 0'a veya 0 dan kucuk bir sayiya esit olana kadar devam edecektir.



Zaten $Kredi degiskeni 0 dan kucuk olunca bizim kullanicimizda Kredinin tamamini odemis demektir dogru degilmi.?



Dongumuz calismayi bitirince dongunun disindaki ilk satirdan programin isleyisi devam eder.



Ve en sonunda "echo" komutuyla "$Sure" degiskeninin icindeki deger ekrana yazilir.



"do while" Donguleri



"do while" donguleri bir onceki konuda anlatilan "while" donguleri ile benzer islemleri yapmakla beraber bir onemli fark icermektedirler.Dongunun kontrol deyimi ,dongunun sonunda yer almaktadir.Bu durum dongu yapimizin, verdigimiz kosullar ne olursa olsun en az bir kere calisacagini gostermektedir.




do
{



Bu parentezlerin icindeki kod grubunu uygula



}



while (sartimiz dogrulaniyorsa); -- geriye don ve tekrar uygula







Yukarida acik sekilde goruldugu uzere dongumuz "sartlarimiz" ne olursa olsun "do" komutu ile baslayan dongumuzu bir kez isletecek ve "while" ile verilen satirdaki "sartlara" bakacaktir.Eger sart "dogruysa" (true) geriye donerek donguyu ilk yaptigi sekilde "do" ile basyalayan yerden itibaren bir kez daha isletecektir.



Hemen bir ornek verelim,



do
{



echo ("Kredi limitinizi astiginiz icin son aldiginiz urun sepetnizden cikarildi");
$AlisverisToplami = $AlisverisToplami - $SonAlinanUrun;
$SonAlinanUrun = $SonAlinanUrundenBirOncekiUrun;



}



while ($AlisverisToplami > $KrediLimiti);



Yukaridaki ornekte ozellikle bir hata yapilmistir.Hatamiz kodlarla ilgili degil mantikla ilgilidir.Gordugunuz gibi daha kullanicinin limiti asip asmadigina bakmadan ekrana bir uyari yazisini cikarilmasiydi.Belki musterimiz limiti asti belki asmadi.Ama bu sekilde "do while" dongusu ile yazdigimiz programlarda dikkatinizi cekmek istedigimiz nokta da iste buydu.Dongunun kontrol degiskeni dongu calismaya basladigi ilk seferden sonra kontrol edilir.Dolayisi ile her halukarda musteri ekranda bu uyariyi en az bir kere gorecektir.






Bu dongu yapisini o zaman nerede kullanacagiz?Simdi size bu dongu yapilarinin nasil ve nerede kullanilcagini biraz aciklamaya calisalim.Bir mantiksal ornekle baslayalim,



do
{
Bir sonraki kavsaga kadar arabayi sur;
}
while ($Kavsak != 10);



Ozet olarak eger PHP'nin sizin icin bir islemi kesin olarak yapmasini ve ayni zamanda bir kontrol mekanizmasi ile donatilmasini istiyorsaniz bu dongu tam sizin icin yaratilmis demektir )



Bir baska ornekle bu dongunun kullanimini pekistirelim.simdi girdigimiz bir sayinin "asal" sayi olup olmadiginin arastirildigi bir uygulama yazalim.



1.Text editorunuzu acin ve asgidakileri yazin.



<HTML>
<HEAD></HEAD>
<BODY>
<FORM METHOD = POST ACTION="asalsayi.php">
Asalsayi olup olmadigini merak ettiginiz rakami giriniz:
<INPUT NAME="Sayi" TYPE="Text">
<BR>
<BR>
<INPUT TYPE=SUBMIT VALUE = "Buraya tiklayarak sayinin asal olup olmadigini ogrenin...">
<BR>
</FORM>
</BODY>
</HTML>



2.Bu dosyayi "asal.html" olarak kayit edin.



3.Yeni bir text dosyasi acip asagidakileri yazin.



<HTML>
<HEAD></HEAD>
<BODY>
<?php
$Bolunen = 2;
do
{



$Kalan = $Sayi%$Bolunen;
$Bolunen = $Bolunen + 1;
} while ($Kalan !=0 AND $Bolunen<$Sayi);



if (($Bolunen<$Sayi) || ($Sayi ==0)){



echo ("Sayiniz asal bir sayi DEGIL");
}



else {
echo ("Sayiniz ASAL bir sayidir.");
}



?>



</BODY>
</HTML>



4.Bu dosyayi"asalsayi.php" olarak kayit edin



5."asalsayi.html" dosyasini acip bir kez programi deneyin.



Ornek Dosyalar



http://www.turk-php.com/ornekler/asalsayi.html



http://www.turk-php.com/ornekler/asalsayi.php



Program nasil calisiyor



Ilk satirda $Bolunen degiskenini tanimladik.Ozellikle bu degiskeni 2 den baslattik cunku butun sayilar 1'e bolunebilir.



Programda $Kalan degiskeni ile ,kullanicin girdigi sayinin dongu icerisinde o andaki karsilik gelen sayiya bolumunden kalan olup olmadigina bakiyoruz.Sonucta bu islemi "mod" operatorunu kullanarak yapiyoruz(% isareti PHP de "mod" almak icin kullanilir.Bu konu ile ilgili detayli aciklama daha onceki konularda yapilmisti.Sitemizin arama fonksiyonlarini kullanarak bu yaziya ulasabilirsiniz.Veya yazimiz yazilrken veritabanindaki URL degeri http://www.turk-php.com/stories.php?.../03/01/6469641 olan linkten bu bilgiye ulasabilirsiniz. )



Kullanicinin web formundan girdigi sayi,teker teker 2 den baslayarak kendisine gelene kadar butun sayilara bolunuyor.Mesela 263 un bir asal sayi olup olmadigina bakiyorsaniz ,teker teker 2,3,4,5,6,7,8 ... sayilarina bolunuyor.Dongu her calistiginda bir sonuc cikiyor.Bu sonuc dongunun kontrol deyimi ile test ediliyor.Bu testten eger "dogru" cevabi cikarsa dongu tekrar calisiyor ve bu boyle surup gidiyor.Eger sayinin kendisine gelindiyse ve halen matematiksel olarak kalan sifira esit degilse bu demektirki sayimiz asal.Yok eger dongunun icerisinde bir sayi denenirken oldu ki kalan sifir oldu,bu da sayimizin asal olmadigini gosteriyor.Iste dongumuzun kontrol deyimide toplam bu hali test ediyor.
Bir sonraki konumuz olan "For Donguleri"'inde gorusmek uzere saglicakla kalin.


"For" Donguleri(for loops)



For donguleri belirli bir kod parcasinin sizin istediginiz sayi kadar tekrar edilmesini saglar.Bir baska deyisle sizin istediginiz sayi kadar, dongunun "iteration" yani iterasyon islemine tabii tutulmasini saglar.




for (Sayaci Kur ; Sayaci Test Et ; Sayaca Ekle Veya Sayactan Cikart)



{



Bu parantezin icerisindeki kod grubunu uygula



}







Yukarida sozu gecen "Sayac" kavrami ile dongunun kac kez calistigini hesapliyoruz.Bu "sayac" ile ayni zamanda eger belirledigimiz sayi kadar cevrim gerceklesmis ise dongumuze son veriyoruz.



Aslinda "for" dongusu kurmak sartimiz icerisinde tanimladigimiz bu uc ogenin ucunude kullanmak zorunda degiliz.Bizler PHP ogrenmeye yeni basladigimiz icin orneklerimizde bu uc ogeyide kullanacagiz.



Eger bir satirda kendi ismimizi 10 defa yazdirmak istersek simdiye kadar ogrendigimiz bilgilerle bunu nasil yapariz?



$Sayac = 0
while ($Sayac<10)
{
echo "Benim adim Serkan !";
$Sayac =$Sayac+1



}



Yukaridaki dongunun kac defa calistigini tahmin edebilirimisiniz?Sizce dongu 9 defa mi calisti?Cunku 10'a gelmeden dongu durdumu?Acaba 11 kez mi calisti cunku biz $Sayac'i 0 dan baslattik ?



Evet 10 defa calismasini istedigimiz bir dongu icin cok fazla soru degil mi?Aslinda yukaridaki dongu tam olarak 10 defa calisir.



Iste bu tip sorunlari ortadan kaldirmak icin en guzel yontem "For" donguleri kullanmaktir.






Simdi ayni islemi birde "for" dongusu kullanarak deneyelim,



for ($Sayac =1 ; $Sayac<=10; $Sayac++)
{
echo "Benim adim Serkan!";
}



Gordugunuz gibi dongunun kac defa calisacagi konusunda bir endise duymaniza gerek yok.Hepsi sizin icin $Sayac ile veriginiz sayi kadar isletilecek.



Bu dongu yapisini kullanirken ornek olarak sayacin kendisinide ekrana yazdirabilirdik,



for ($Sayac =1 ; $Sayac<=10; $Sayac++)
{
echo $Sayac;
}



Ciktimiz soyle bir sey olacakti.12345678910



Not :Burada kullanilan "$Sayac++" ifadesi "$Sayac = $Sayac + 1" ifadesi ile aynidir.Yanlizca bir kisayol olarak bu notasyon kullanilmistir.



Simdi de bir uygulama yapalim.



1.Text editorunuzu acin ve asagidakileri yazin.



<HTML>
<HEAD></HEAD>
<BODY>
<FORM METHOD=POST ACTION="dinamik.php">
Kac tane cocugunuz var?
<INPUT NAME="Sayi" TYPE="TEXT">
<BR>
<BR>
<INPUT TYPE=SUBMIT>
<BR>
</FORM>
</BODY>
</HTML>






2.Bu dosyayi "dinamik.html" olarak kayit edin.



3.Yeni bir text dosyaysi acip asagidakileri yazin.



<HTML>
<HEAD></HEAD>
<BODY>
<FORM METHOD=GET ACTION="dinamik2.php">
<?php
for ($Sayac=0 ; $Sayac<$Sayi ; $Sayac++)
{
$Oteleme = $Sayac + 1;
echo "<BR><BR>Lutfen $Oteleme numarali cocugun adini giriniz : <BR>";
echo "<INPUT NAME=Cocuk [] TYPE=TEXT";
}



if ($Sayac==0) echo"Lutfen bir tusa basarak devam ediniz";
?>
<BR>
<BR>
<INPUT TYPE=SUBMIT>
</FORM>
</BODY>
</HTML>



4.Bu dosyayi "dinamik.php" olarak kayit edin.



5.Yeni bir text dosyasi acip asagidakileri yazin.



<HTML>
<HEAD></HEAD>
<BODY>
<?php
$Sayac=0;
echo "Cocuklarinizin isimleri :";
do
{
echo "<BR><BR>$Cocuk[$Sayac]";
$Kontrol = "$Cocuk[$Sayac]";
$Sayac = $Sayac + 1;
} while ($Kontrol != "");
if ($Sayac == 1) echo "Cocuk sayisi olarak sifir girdiniz program sonlaniyor";
?>
</BODY>
</HTML>



6.Bu dosyayi "dinamik2.php" olaraak kayit edin.



7."dinamik.html" dosyasini acip bir kac kez programi farkli degerler vererek deneyin
staticiation Şuanda Forumda Değil   Alıntı yaparak cevapla