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
|