MultiServis.Net //PHP El Kitabý

<<= Önceki Sayfa | PHP Ana Sayfa | Sonraki Sayfa =>>

Dongu ve Diziler - BOLUM 5 Yazar: Serkan Tarih: 01/03/02

Giris:

Sirali olmayan index yapili dizilerin Iterasyonu†

Diziyi duzgun olarak siraladiginiz(indexlediginiz) zaman cogu islemi yapmak gercekten kolay olacaktir.Birde asagidaki gibi bir diziye sahip oldugumuzu varsayalim,

$Dizimiz[3569]="Gercekten buyuk degilmi";
$Dizimiz[1]="Gerceken kucuk";
$Dizimiz[599]="ehh iste normal bir sayi";

Simdi PHP'nin bize dizilerle ilgili sundugu fonksiyonlari ogrenerek belirli kaliplara bagli kalmaktan kurtulup her turlu dizi islemini gerceklestirebilecegiz.

current ve key fonksiyonlari

Dizi icerisinde hangi elementin o anda kullanildigini gormek icin current (), bu elementin index degerini bulmak isterseniz key () fonksiyonunu kullanmalisiniz.

Hemen cok kucuk bir kod parcasi uzerinde PHP'nin yeni ekledigimiz dizi elementlerine hangi indexi otomatik olarak verdigini gorelim.

$Yonetmen[4]="Yilmaz Guney";
$Yonetmen[1]="Clint Eastwood";
$Yonetmen[93]="Steven Spielberg";
$Yonetmen[24]="Al Pacino";

Asagidaki iki satir kodu eklersek "$Yonetmen[]" dizisi icin o anki gecerli index degerini gorebiliriz.

$IndexDegeri = key($Yonetmen);
echo ($IndexDegeri);

Boyle bir programin ciktisinda "key ()" fonksiyonu "4" degerini dondurecek ve echo komutuyla ekrana yazilacaktir.

Gordugunuz gibi o anda gecerli olan index degeri dizinin ilk elemanini bize gosterdi.

Eger current () fonksiyonunu kullanmis olsaydik dondurecegi deger "Yilmaz Guney" olacakti.

$GecerliIcerik = current ($Yonetmen);
echo ($GecerliIcerik);

Simdide bir satir daha ekleyelim dizimize ve bakalim PHP hangi indexi verecek bu yeni eklenen dizi elementine,

$Yonetmen[] = "Mel Gibson";

"Mel Gibson" index degeri "94" olarak dizimiz icerisinde yer alacakti.current () ve
key () fonksiyonlarini kullanarak,dizi icerisinde ekleyecegimiz bir sonraki elemente hangi index degerinin verilecegini nasil bulabiliriz?Yazimizi okumaya devam edin :)

Next () ve Prev ()

Diziye eklenen yeni elemanlarin index degerini bulmak icin next () ve prev () fonksiyonlarini kullanabilirsiniz.Bu fonksiyonlar dizi boyunca elementler arasinda dolasmanizi saglarlar.(These functions allow you to navigate through arrays,by moving the pointer to the next or previous element in the array).Bu iki fonksiyonda,argument olarak dizi ismini alirlar.Yani hangi fonksiyonun elementleri arasinda gezinmek istiyorsaniz fonksiyonu,o dizinin adini vererek kullanmalisiniz.

Simdi bir onceki konuda yarattigimiz diziyi ele alalim ve bu fonksiyonlari uygulamali olarak gorelim,

$Yonetmen[4]="Yilmaz Guney";
$Yonetmen[1]="Clint Eastwood";
$Yonetmen[93]="Steven Spielberg";
$Yonetmen[24]="Al Pacino";
$Yonetmen[] = "Mel Gibson";

next () fonksiyonunu, current elementimizin,

Asagida YORUM ile belirtilmis yerlerin tamami yazara aittir ve dogrulugu konusunda garanti verilemez.Yanlizca konunun daha iyi anlasilmasi icin okuyabilirsiniz.Eger olayi anladiysaniz yaziya kaldiginiz yerden yorumlari okumadan devam ediniz.

--->YORUM : (yani yukaridaki dizide gordugunuz gibi dizinin ilk elementi.Bu ilk element 4 numarasiyla indexlenmis ve icerigi de Yilmaz Guney.Simdi dizideki islemleri gozunuzun onunde canlandirmak isterseniz bir kaset calar dusunun o sirada calmaya hazir sarki tabii ki kasedin ilk sarkisidir.Eger biz kasedi kullanir ve birinci sarkiyi dinlersek artik bir sonraki sarki calmaya hazirdir degilmi.Iste burada bahsedilen current element bizim o nda kullanilmaya hazir olan dizi elementimizdir. Guzel bir yaklasim simdi aklima geldigi icin yaziyorum.Biraz olsun sizi current'dan next'ten kurtarip olayi anlatabildiysem ne alaaa anlamadiysaniz lutfen mail atin )

ne oldugunu kontrol etmeden kullanalim ve sonuca bakalim,

--->YORUM : (dizi su anda hic kullanilmadigi icin ilk sarkimiz calmaya hazir.Yani dizinin ilk elementi current element.Eger bir dongu icerisinde islem gerceklistiriyor olsaydik ve dizinin elemanlari birer birer kullaniliyor olsaydi,islemin belirli asamlarinda dizinin hangi index numarali elementi current olacakti veya gercekten o asamada sizin istediginiz element mi kullaniliyor.Tum bu islemler icin dogal olarak iste burada verilen komutlari kullaniyoruz.)

next ($Yonetmen);
$IndexDegeri = key($Yonetmen);
echo ($IndexDegeri);

Bu kucuk programimizin ciktisi "1" olacaktir.Cunku next fonksiyonu cagrilmadan once current elementin index degeri "4" tu.Yani dizinin ilk elemaniydi.Biz next ($Yonetmen); diyerek dizi icerisindeki bir sonraki elementi kullanima hazir hale getirdik.Sonrasinda $IndexDegeri degiskeni icerisnde key($Yonetmen) fonksiyonu ile verdigimiz degerin saklanmasini sagladik.echo ($IndexDegeri) komutu ile de ekrana yazdirdik.

next ($Yonetmen);
next ($Yonetmen);
next ($Yonetmen);
next ($Yonetmen);
$IndexDegeri = key($Yonetmen);
echo ($IndexDegeri);

Gordugunuz gibi fonksiyonu uc defa daha kullandim simdi artik echo komutu ile ekrandan alacagimiz cikti "94" olacaktir.Eger bu index numarali elemnetin icerigini ekranda yazdirmak isteseydik,

$GecerliIcerik = current ($Yonetmen);
echo ($GecerliIcerik);

"Mel Gibson" ciktisini alacaktik.

prev () fonksiyonun kullanimida tamamen yukaridaki ile aynidir.Bu fonksiyonla dizi icerindeki elementler arasinda "geriye" dogru gezinmemizi sagliyoruz.

next ($Yonetmen);
next ($Yonetmen);
next ($Yonetmen);
next ($Yonetmen);
prev ($Yonetmen);
$IndexDegeri = key($Yonetmen);
echo ($IndexDegeri);

Kod grubunun ciktisi "24" olacaktir.Dizi icerisinde once dort element ileriye dogru gidip o elementin "current" olmasini sagladik.Sonra prev ($Yonetmen); satiri ile dizi icerisinde bir element geriye gittik.Diger satirlarda ise iste o elementin "index" degerini ekrana yazdirdik.

Simdi burada bir konuyu belirtelim.Eger dizimiz icerisnde mesela ikinci "next" satirinda dizimizin sonuna gelmis olsaydik ne olacakti.Ondan sonraki kodlar hata uyarisi verecekmiydi?Bu sorunun cevabi kesinlikle HAYIR'dir.Boyle bir durumda hic bir sey olmayacakti.Kodumuz hic bir hata vermeyecegi gibi hic bir degerde dondurmeyecekti.Yeterince centilmence degilmi :)

Baska programlama dillerinde bu durumdaki bir program mutlak hata dondurur.PHP ile calismak icin iste size bir baska neden.Gercekten de mukkemmel bir programlama dili.

prev ($Yonetmen);
next ($Yonetmen);
next ($Yonetmen);
$IndexDegeri = key($Yonetmen);
echo ($IndexDegeri);

Kod grubuda ayni sekilde hata dondurmeyecektir.Gordugunuz gibi daha dizinin basinda dizideki elementi bir geriye almak istedik.This would still return nothing at all.

list ve each fonksiyonlari

Bu iki fonksiyonla dizimiz icerisinde yanlizca "veri iceren" element'lerin kullanimini sagliyoruz.Bir dongumuz icerisinde mesela "bos" icerige sahip elementlerin kullanilmasini istemiyor olabiliriz.Bu durumda dizi icerisindeki butun veri iceren elementleri cok kolayca ekranda gosterebiliriz.Mesela "while" dongusu icin asagidaki kodu yazabiliriz,

while (list(IndexDegerimiz,ElementinIcerigi) = each (DizininAdi)

Yukaridaki satir diyorki : DizininAdi ile verilen dizi adindaki herbir elementin "index" degerini IndexDegerimiz'e , iceriginide ElementinIcerigi'ne esitle.Eger yanlizca index degerinin veya iceriginin dondurulmesini istiyorsaniz,

while (list(IndexDegerimiz) = each (DizininAdi)

veya

while (list(,ElementinIcerigi) = each (DizininAdi)

Ornegimizle verilen kucuk kod parcasi uzerinde uygulamali olarak gosterirsek,

while (list($IndexDegeri,$GecerliIcerik) = each ($Yonetmen))
{
echo "<BR>$IndexDegeri - $GecerliIcerik";
}

String index yapili dizilerin Iterasyonu‡

Karekterler ile indexlenmis dizilerin elementleri arasinda dolasmak, yukarida aciklanan numara ile indexlenmis diziler arasinda dolasmak ile aynidir.Bi kac fark bulunmaktadir tabii ki ama mantik hepsinde aynidir.Simdi bir kod parcasi uzerinde farkliliklari anlatalim.

$EyaletBaskenti["ga"]="Atlanta";
$EyaletBaskenti["il"]="Springfield";
$EyaletBaskenti["ca"]="Sacramento";
$EyaletBaskenti[]="Cheyene";

"Cheyene" ile verilen deger dizi icerisinde $EyaletBaskenti[0] ogesi olarak saklanacaktir.Gordugunuz gibi index degeri "0" dir.PHP'nin dizinin bu ogesi hakkinda herhangi bir bilgiye sahip degildir ve index olarak sifir degerini atamasi cok da supriz degildir.Eger herhangi bir elemente numara vererek indexlemis olsaydik ondan sonra gelecek ilk sayinin numarasi bu indexi verilmeyen elemente atanacakti.Su anda dizide numara ile indexlenmis bir deger olmadigi icin sifir verilerek bu element indexlendi.

current () ve key () fonksiyonlari yine ayni sekilde kullanilacaktir.Herhangi bir fark yoktur.

$HangiEyalet = current ($EyaletBaskenti);
$HangiKisaltma = key ($EyaletBaskenti0;
echo "$HangiEyalet - $HangiKisaltma";

Bu kodun calistirilmasi halinde "Atlanta - ga" seklinde bir ciktiyi ekrandan alirsiniz

next () ve prev () fonksiyonlari yine ayni sekilde kullanilacaktir.Herhangi bir fark yoktur.

$EyaletBaskenti["ga"]="Atlanta";
$EyaletBaskenti["il"]="Springfield";
$EyaletBaskenti["ca"]="Sacramento";
$EyaletBaskenti[]="Cheyene";
next ($EyaletBaskenti);
$HangiEyalet = current ($EyaletBaskenti);
$HangiKisaltma = key ($EyaletBaskenti0;
echo "$HangiEyalet - $HangiKisaltma";

Bu kodun calistirilmasi halinde "Springfield -il" seklinde bir ciktiyi ekrandan alirsiniz

array () fonksiyonuda yine ayni sekilde kullanilacaktir.Herhangi bir fark yoktur.

$EyaletBaskenti = array ("ga" => "Atlanta","il" => "Springfield","ca" => "Sacramento",
"wy" => "Cheyene");

list () ve each () fonksiyonlari yine ayni sekilde kullanilacaktir.Herhangi bir fark yoktur.

while (list($EyaletKisaltmasi,$EyaletIsmi) = each ($EyaletBaskenti))
{
echo "<BR>$EyaletKisaltmasi - $EyaletIsmi";
}

Not : Yukarida kullanilan $EyaletKisaltmasi,$EyaletIsmi degiskenleri yerine istediginiz bir degisken ismi yazabilirsiniz.Burada onemli olan "each" ile verilen $EyaletBaskenti dizisinin adidir.

Yani ,

while (list($SerkanMakinecidir,$OzgurHiyariElektronikcidir) = each ($EyaletBaskenti))
{
echo "<BR>$SerkanMakinecidir - $OzgurHiyariElektronikcidir";
}

yazmak tamamen ayni seylerdir her ikisininde ciktisi soyle olacaktir.

ga - Atlanta
il - Springfield
ca - Sacramento
wy - Cheyene

Dizilerin Siralanmasi

Dizilerin siralanmasi icin PHP icerisinde bircok fonksiyon bulunmaktadir.Bizler bunlarin arasindan en cok kullanilan 5 tanesini inceleyecegiz.Burada anlatilan fonksiyonlar genel olarak kullanilmaktadir.

sort ()

En temel siralama fonksiyonudur. Dizinin icerisindeki elementleri iceriklerine gore alfabetik olarak siralar.Argument olarak siralanacak dizi isminin verilmesi yeterlidir.

sort (DizininAdi)

Ornek vermek istersek ,

$Yonetmen = array ("Orson Welles","Carol Reed","Fritz Lang","Jacques Tourner");

Yonetmenlerimizin isimlerinin yer aldigi boyle bir diziyi siralamak istersek,

sort ($Yonetmen);

yazmamiz yeterli olacakti.

Bu islemin sonucunu ekranda gormek icin yine list () ve each () fonksiyonlarini 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"

olacaktir.

Peki dizimizi boyle numaralar ile indexlemek yerine karekterler kullanarak indexlemis olsaydik (yani harf gruplari kullanarak indexleseydik)?

asort ()

Karekterler ile indexlenmis dizileri elementlerinin iceriklerine gore siralamak icin kullanilir.Sunu sorabilirsiniz sort () fonksiyonuda ayni isi yapiyordu?Cevap icin asagidaki kod orneklerine ve aciklamalara bakin.

Simdi eyaletler dizimizi ele alalim,

$EyaletBaskenti = array ("ga" => "Atlanta","il" => "Springfield","ca" => "Sacramento",
"wy" => "Cheyene");

Dizimiz boyle bir kodun ardindan dogal olarak asagidaki gibi yaratilacaktir

$EyaletBaskenti["ga"]= "Atlanta";
$EyaletBaskenti["il"]= "Springfield";
$EyaletBaskenti["ca"]= "Sacramento";
$EyaletBaskenti["wy"]= "Cheyene";

eger sort () kullanarak siralamis olsaydik son durum soyle olacakti,

$EyaletBaskenti[0]= "Atlanta";
$EyaletBaskenti[1]= "Cheyene";
$EyaletBaskenti[2]= "Sacramento";
$EyaletBaskenti[3]= "Springfield";

diger bir deyisle harfler kullanarak indexledigimiz dizimizde,bu harfler numaralarla degistirilecekti.Bunu engellemek icin mutlaka asort () kullanilmalidir,

asort ($EyaletBaskenti);

komutunu verdikten sonra artik dizimiz asagidaki sekilde siralanacaktir.

$EyaletBaskenti["ga"]= "Atlanta";
$EyaletBaskenti["wy"]= "Cheyene";
$EyaletBaskenti["ca"]= "Sacramento";
$EyaletBaskenti["il"]= "Springfield";

ekranda siralamanin nasil degistgini gormek icin tabii ki list () ve each () fonksiyonlarini "while" dongusu ile su sekilde kullanabilirsiniz,

while (list($EyaletKisaltmasi,$EyaletIsmi) = each ($EyaletBaskenti))
{
echo "<BR>$EyaletKisaltmasi - $EyaletIsmi";
}

rsort () ve arsort() fonksiyonlari

Bu iki fonksiyonda amac olarak sort () ve asort () fonksiyonlarina benzerdir.Tek farki dizi elementlerinin iceriklerini alfabenin tersi yonunde siralamalaridir.

$Yonetmen = array ("Orson Welles","Carol Reed","Fritz Lang","Jacques Tourner");
rsort ($Yonetmen);

ve ayni sekilde kareketer kullanilarak yaratilmis diziler icinde ,

$EyaletBaskenti = array ("ga" => "Atlanta","il" => "Springfield","ca" => "Sacramento",
"wy" => "Cheyene");
arsort ($EyaletBaskenti);

Ciktilari icin ornek vermek istemiyorum herhalde buaraya kadar olan bolumu okuduysaniz anlamissinizdir.

ksort ()

Karekter dizisi kullanilarak yaratilmis diziler icin,"indexleri" kullanarak alfabetik olarak siralama yapar,

$EyaletBaskenti = array ("ga" => "Atlanta","il" => "Springfield","ca" => "Sacramento",
"wy" => "Cheyene");
ksort ($EyaletBaskenti);

kodumuzun sonunda dizimiz su sekilde siralanacaktir,

$EyaletBaskenti["ca"]= "Sacramento";
$EyaletBaskenti["ga"]= "Atlanta";
$EyaletBaskenti["il"]= "Springfield";
$EyaletBaskenti["wy"]= "Cheyene";

Her turlu soru ve oneriniz icin mail atabilir veya bu yazinin yayinlandigi sayfadaki yorum bolumunu kullanabilirsiniz.

Serkan Hadi Ceylani
serkan@turk-php.com

† : "Iteration" kelimesinin tam turkcesi "yinelemek"tir.Gordugunuz gibi burada bu sekilde kullanilirsa anlamsiz bir seyler cikiyor.O nedenle "iterasyon" olarak kullanilmistir.Okuyucudan kendine ozgu bir anlam cikarmasi beklenmektedir.Sonuc olarak turkce olmayan bir teknoloji aciklanmaya calisilmaktadir.

‡ : "String" kelimesinin tam turkcesi "sicim"dir.Programcilik literaturunde "duz yazi" veya "text" anlamina gelecek sekilde kullanilmaktadir.Okuyucudan konu ile ilgili arastirma yapmasi beklenmektedir.Sonuc olarak turkce olmayan bir teknoloji aciklanmaya calisilmaktadir

<<= Önceki Sayfa | PHP Ana Sayfa | Sonraki Sayfa =>>