Yazılım

PHP Diziler (Arrays): Verileri Düzenli Saklamanın Yolu

15 Şubat 2026 15 dk okuma 4 görüntülenme

Veri Dünyasının Sırt Çantası: PHP Diziler

Selamlar, ben Buğrahan. Serimizin üçüncü yazısına hoş geldiniz. Hatırlarsanız, ilk yazıda PHP’nin neden hala webin omurgası olduğundan bahsetmiş, ikinci yazıda ise döngülerle işleri nasıl otomatiğe bağladığımızı konuşmuştuk. Şimdi ise yazılım hayatımda en çok kullandığım, onsuz bir projenin hayalini bile kuramadığım o yapıdan bahsedeceğiz: Diziler (Arrays).

Konuya girmeden önce sizi biraz ofisten çıkarıp ormana götürmek istiyorum. Biliyorsunuz, bilgisayar başından kalktığımda kendimi doğaya atıyorum. Kamp yapmaya gideceğim zaman hazırladığım sırt çantasını düşünün. Eğer ben çakımı, fenerimi, suyumu, yedek kıyafetlerimi ve yiyeceklerimi çantanın içine rastgele fırlatırsam ne olur? İhtiyacım olan şeyi ararken dakikalarca çantayı karıştırmak zorunda kalırım. Belki de en lazım olduğu anda o çakıyı bulamam. İşte yazılımda değişkenleri (variables) tek tek, dağınık bir şekilde tanımlamak tam olarak budur: Koca bir kaos.

Ama eğer çantanın gözlerini kullanırsam; yan cebe mataramı, üst kapağa fenerimi, ana göze kıyafetlerimi koyarsam, her şeyin yeri bellidir. Elimle koymuş gibi bulurum. İşte Diziler, verilerimizi düzenli bir şekilde saklamamızı sağlayan o ceplerdir, o bölmelerdir. 2005 yılından beri kod yazıyorum ve samimiyetle söyleyebilirim ki; iyi bir dizi yapısı kurmak, temiz kod yazmanın yarısıdır.

Bugün Pixel Lab® mutfağında kullandığımız tekniklerle, verileri nasıl istiflediğimizi, nasıl aradığımızı ve onları gerçek hayatta (bir e-ticaret sepeti veya blog sistemi gibi) nasıl kullandığımızı en ince detayına kadar inceleyeceğiz. Çayınızı veya kahvenizi alın, başlıyoruz.

Dizi Nedir ve Neden İhtiyaç Duyarız?

Teknik tanıma girmeden önce mantığı oturtalım. Bir öğrenci listesi yapacağınızı varsayın. Eğer dizileri bilmiyorsanız, kodunuz muhtemelen şöyle görünecektir:

$ogrenci1 = "Ahmet";
$ogrenci2 = "Ayşe";
$ogrenci3 = "Mehmet";
// ... ve bu böyle 100 öğrenci için devam eder.

Bu, yönetilebilir bir durum değil. Yarın öbür gün 101. öğrenci geldiğinde kodu açıp yeni bir satır mı ekleyeceksiniz? Ya da bu öğrencilerin hepsini ekrana yazdırmak istediğinizde 100 satır echo komutu mu yazacaksınız? Tabii ki hayır. Yazılım, tekrarı sevmez; sadeliği sever.

Dizi (Array), tek bir değişken adı altında birden fazla değeri saklamamıza olanak tanır. Yani yüzlerce değişken tanımlamak yerine, tek bir $ogrenciler kutusu oluşturur ve hepsini içine atarız.

1. İndeksli Diziler (Indexed Arrays): Basit Listeler

En temel dizi türüdür. Benim kamp ihtiyaç listem gibidir. Sırasıyla elemanları eklersiniz ve bilgisayar onlara otomatik olarak bir numara (indeks) verir. Burada unutmamanız gereken en önemli kural şudur: Yazılım dünyasında saymaya 1'den değil, 0'dan başlanır.

Eskiden PHP'de array() fonksiyonunu kullanırdık ama modern PHP sürümlerinde (ve benim de tercihim olan) köşeli parantez [] kullanımı çok daha temizdir.

// Kamp malzemeleri listem
$kampMalzemeleri = ["Çadır", "Uyku Tulumu", "Mat", "Fener", "Çakı"];

// İlk malzemeyi ekrana yazdıralım
echo $kampMalzemeleri[0]; // Çıktı: Çadır

// Üçüncü malzemeyi yazdıralım
echo $kampMalzemeleri[2]; // Çıktı: Mat

Gördüğünüz gibi, [0] dediğimde listenin en başındaki elemana ulaşıyorum. Eğer [1] deseydim "Uyku Tulumu" gelecekti. Bu 0-indeks mantığına alışmak, yeni başlayanlar için bazen kafa karıştırıcı olabilir ama bir süre sonra beyniniz otomatik olarak 0'dan saymaya başlıyor.

Listeye Sonradan Ekleme Yapmak

Diyelim ki yola çıkmak üzeresiniz ve "Powerbank" almayı unuttuğunuzu fark ettiniz. Listeyi baştan tanımlamanıza gerek yok. PHP'de bir diziye eleman eklemek dünyanın en kolay işidir:

$kampMalzemeleri[] = "Powerbank";

PHP otomatik olarak dizinin sonuna bakar, sıradaki numara neyse (bizim örneğimizde 5) onu atar ve "Powerbank"i oraya yerleştirir. Bu kadar basit.

2. İlişkisel Diziler (Associative Arrays): Etiketli Kutular

İndeksli diziler güzeldir ama her zaman yeterli değildir. Bazen verilere sadece numara ile değil, bir isimle (anahtar/key) ulaşmak istersiniz. Örneğin, bir kullanıcının bilgilerini saklarken $kullanici[0] demek bana bir şey ifade etmez. Ama $kullanici['isim'] dersem, neyi çağırdığımı bilirim.

İlişkisel diziler, benim Pixel Lab® projelerinde en sık kullandığım yapılardan biridir. Veritabanından çektiğimiz bir satır veri, aslında bir ilişkisel dizidir.

$profil = [
    "ad" => "Buğrahan",
    "soyad" => "Yazar",
    "dogum_yili" => 1990,
    "meslek" => "Full Stack Developer",
    "hobi" => "Vahşi Yaşam Belgeselleri"
];

// Veriye ulaşmak çok daha anlamlı
echo "Merhaba, ben " . $profil['ad'] . "."; 
// Çıktı: Merhaba, ben Buğrahan.

Burada => operatörünü görüyoruz. Bu, "soldaki anahtar, sağdaki değeri işaret eder" demektir. Anahtarlar (keys) benzersiz olmalıdır. Eğer aynı anahtarı iki kez kullanırsanız, ikincisi ilkinin üzerine yazar.

Bu yapı, kodun okunabilirliğini inanılmaz derecede artırır. Aylar sonra dönüp kodunuza baktığınızda $urun[4] neydi diye düşünmek yerine, $urun['fiyat'] yazdığını görüp "Ha, tamam burası fiyatı çekiyormuş" dersiniz.

3. Çok Boyutlu Diziler (Multidimensional Arrays): Matruşka Bebekleri

Hayat her zaman tek boyutlu değildir. Bazen çantanın içindeki küçük çantada ne olduğunu bilmeniz gerekir. Diziler içinde diziler saklayabiliriz. Buna çok boyutlu diziler diyoruz.

Özellikle bir e-ticaret sitesi veya blog sistemi yapıyorsanız, verileriniz %99 ihtimalle çok boyutlu dizi olarak gelecektir. Düşünün; birden fazla ürününüz var ve her ürünün kendi içinde adı, fiyatı ve stok bilgisi var.

$urunler = [
    [
        "urun_adi" => "Mekanik Klavye",
        "fiyat" => 2500,
        "stok" => 15
    ],
    [
        "urun_adi" => "Gaming Mouse",
        "fiyat" => 1200,
        "stok" => 40
    ],
    [
        "urun_adi" => "27 inç Monitör",
        "fiyat" => 8500,
        "stok" => 5
    ]
];

Şimdi bu yapıya nasıl erişeceğiz? Diyelim ki "Gaming Mouse"un fiyatını öğrenmek istiyoruz. Önce ana dizideki sırasını (indeksini), sonra da içindeki dizinin anahtarını kullanacağız.

echo $urunler[1]['fiyat']; // Çıktı: 1200

Mantık şu: $urunler[1] bize ikinci diziyi (Mouse dizisini) komple getirir. Sonuna ['fiyat'] eklediğimizde ise o dizinin içindeki fiyat değerini çekeriz. Bu yapı iç içe istediğiniz kadar gidebilir ama tavsiyem; 3 boyuttan fazlası genellikle kafa karıştırır ve kodun yönetilebilirliğini zorlaştırır. O noktada veri yapınızı veya nesne tabanlı (OOP) yaklaşımınızı gözden geçirmeniz gerekebilir.

PHP Dizi Fonksiyonları: İsviçre Çakısı

Dizileri tanımladık, peki onlarla ne yapacağız? PHP, dizilerle oynamak için bize muazzam bir alet çantası sunar. 2005'ten beri binlerce kez kullandığım, adeta elimin uzantısı olmuş temel fonksiyonlara bakalım. Bunlar mülakatlarda da karşınıza çıkar, gerçek projelerde de hayat kurtarır.

count() - Elimizde Ne Var?

Bir dizide kaç eleman olduğunu sayar. Özellikle döngü kurarken (gerçi foreach varken pek gerek kalmıyor ama) veya listenin boş olup olmadığını kontrol ederken çok işe yarar.

echo count($kampMalzemeleri); 
// Eğer listede 6 malzeme varsa, 6 döner.

array_push() ve array_pop() - Giriş Çıkışlar

array_push(), dizinin sonuna bir veya birden fazla eleman ekler. Yukarıda gösterdiğim $dizi[] = "yeni" yöntemiyle aynı işi yapar. Aralarındaki fark; array_push fonksiyon olduğu için bir tık daha yavaştır (mikrosaniyelerden bahsediyoruz) ama aynı anda birden fazla eleman ekleyecekseniz kullanışlıdır.

array_pop() ise dizinin sonundaki elemanı siler ve sildiği o elemanı size geri döndürür. Sanki bir yığın (stack) yapısı gibi düşünün.

$gorevler = ["Kod Yaz", "Toplantı Yap", "Mailleri Oku"];

// Son görevi (Mailleri Oku) listeden çıkar ve al
$sonGorev = array_pop($gorevler);

echo $sonGorev; // Çıktı: Mailleri Oku
print_r($gorevler); // Çıktı: ["Kod Yaz", "Toplantı Yap"]

in_array() - Var mı Yok mu?

Bir değerin dizide olup olmadığını kontrol eder. Boolean (true/false) döner. "Listemde Fener var mı?" sorusunun cevabıdır.

if (in_array("Fener", $kampMalzemeleri)) {
    echo "Fener yanımızda, karanlıkta kalmayız.";
} else {
    echo "Feneri unutmuşsun!";
}

array_search() - Nerede Bu?

in_array sadece "var" ya da "yok" der. array_search ise aradığınız şeyin anahtarını (indeksini) verir. Eğer bulamazsa false döner.

$anahtar = array_search("Mat", $kampMalzemeleri);
echo $anahtar; // Örneğin Mat 2. sıradaysa "2" döner.

array_merge() - Güçleri Birleştirme

İki veya daha fazla diziyi birleştirip tek bir dizi haline getirir. Örneğin, benim kamp listemle arkadaşımın kamp listesini birleştirip tek bir "alınacaklar listesi" oluşturabiliriz.

$benimListem = ["Çadır", "Mat"];
$arkadasinListesi = ["Yiyecek", "İçecek"];

$tumListe = array_merge($benimListem, $arkadasinListesi);
// Sonuç: ["Çadır", "Mat", "Yiyecek", "İçecek"]

Dikkat: İlişkisel dizilerde array_merge kullanırken, eğer iki dizide de aynı anahtar (key) varsa, ikinci dizideki değer ilkinin üzerine yazar. Bu, bazen istediğimiz bir şeydir (güncelleme mantığı), bazen de veri kaybına yol açar.

Gerçek Hayat Senaryosu 1: Basit Bir Blog Sistemi

Şimdi teoriyi bırakıp pratiğe, işin mutfağına girelim. Veritabanı kullanmadan, sadece dizilerle basit bir blog anasayfası simüle edelim. Bu örnek, çok boyutlu dizilerin ve foreach döngüsünün gücünü anlamanız için harika bir pratik.

// Blog yazılarımızı bir dizide tutuyoruz
$blogYazilari = [
    [
        "baslik" => "PHP Diziler",
        "yazar" => "Buğrahan",
        "tarih" => "2023-10-25",
        "ozet" => "Verileri düzenli saklamanın yollarını öğreniyoruz.",
        "aktif" => true
    ],
    [
        "baslik" => "Doğada Kamp",
        "yazar" => "Buğrahan",
        "tarih" => "2023-10-20",
        "ozet" => "Şehirden kaçış rotaları.",
        "aktif" => true
    ],
    [
        "baslik" => "Hatalı Kod",
        "yazar" => "Admin",
        "tarih" => "2023-01-01",
        "ozet" => "Bu yazı yayından kaldırıldı.",
        "aktif" => false // Bu yazıyı göstermeyeceğiz
    ]
];

// HTML Çıktısı
echo "<div class='blog-listesi'>";

foreach ($blogYazilari as $yazi) {
    // Sadece aktif olan yazıları gösterelim
    if ($yazi['aktif'] === true) {
        echo "<article style='margin-bottom: 20px; border-bottom: 1px solid #ccc;'>";
        echo "<h3>" . $yazi['baslik'] . "</h3>";
        echo "<small>" . $yazi['tarih'] . " - " . $yazi['yazar'] . "</small>";
        echo "<p>" . $yazi['ozet'] . "</p>";
        echo "</article>";
    }
}

echo "</div>";

Bu kod bloğunda ne yaptık? $blogYazilari adında çok boyutlu bir dizi oluşturduk. Sonra foreach ile bu dizinin içinde döndük. Her bir turda, o anki yazıyı $yazi değişkenine atadık. İçeride basit bir if kontrolüyle yazının aktif olup olmadığına baktık. Eğer aktifse, HTML etiketleri arasına verileri gömerek ekrana bastık. İşte dinamik web sitelerinin (WordPress, Joomla vb.) temel çalışma mantığı tam olarak budur.

Gerçek Hayat Senaryosu 2: E-Ticaret Sepet Mantığı

Biraz daha karmaşık ama çok öğretici bir örnek yapalım. Bir alışveriş sepeti düşünün. Kullanıcı "Sepete Ekle" butonuna bastığında arka planda neler dönüyor? Genellikle bu veriler PHP oturumlarında (Session) bir dizi olarak tutulur.

Diyelim ki kullanıcının sepetinde şu an 2 ürün var ve 3. bir ürün eklemek istiyor. Ancak bir detay var: Eğer eklemek istediği ürün zaten sepette varsa, yeni satır eklememeli, sadece o ürünün "adet" (quantity) bilgisini artırmalıyız. İşte burada array_column ve array_search gibi fonksiyonlar devreye giriyor.

// Mevcut Sepet (Session'dan geldiğini varsayalım)
$sepet = [
    [
        "id" => 101,
        "ad" => "Laptop",
        "fiyat" => 15000,
        "adet" => 1
    ],
    [
        "id" => 102,
        "ad" => "Mouse",
        "fiyat" => 500,
        "adet" => 2
    ]
];

// Eklenecek Yeni Ürün (veya var olan ürün)
$eklenecekUrunId = 102; // Mouse tekrar ekleniyor

// Sepetteki ürünlerin sadece ID'lerini bir dizi olarak alalım
// array_column harika bir fonksiyondur, çok boyutlu diziden tek bir sütunu çeker.
$sepetIdleri = array_column($sepet, "id");

// Bu ID sepette var mı diye kontrol edelim
$anahtar = array_search($eklenecekUrunId, $sepetIdleri);

if ($anahtar !== false) {
    // Ürün zaten var, sadece adedini artır
    $sepet[$anahtar]['adet']++;
    echo "Sepet güncellendi: " . $sepet[$anahtar]['ad'] . " adedi " . $sepet[$anahtar]['adet'] . " oldu.";
} else {
    // Ürün yok, yeni olarak ekle
    $yeniUrun = [
        "id" => 105,
        "ad" => "Klavye",
        "fiyat" => 1000,
        "adet" => 1
    ];
    $sepet[] = $yeniUrun;
    echo "Yeni ürün sepete eklendi.";
}

Bu mantık, Pixel Lab®'da geliştirdiğimiz özel e-ticaret altyapılarının en basitleştirilmiş halidir. Gördüğünüz gibi diziler sadece veri saklamak için değil, uygulamanın iş akışını yönetmek için de kritik bir rol oynar.

Dizileri Sıralama: Düzen Hastaları İçin

Ben biraz düzen hastasıyım. Kodlarımın hizası bozuksa uyuyamam, çalışma masamda her şey milimetrik olmalı. Veriler de öyledir; bazen alfabetik, bazen fiyata göre artan, bazen de tarihe göre sıralanmış olmasını isteriz.

PHP'de sıralama (sorting) için bir sürü fonksiyon var ama en sık kullanacaklarınız şunlar:

  • sort(): Diziyi küçükten büyüğe sıralar ama anahtarları (key) bozar, sıfırdan indeksler. Sadece basit listeler için kullanın.
  • rsort(): sort()'un tam tersi, büyükten küçüğe sıralar.
  • asort(): İlişkisel diziler için kraldır. Değerlere göre sıralar ama anahtarları korur. Yani "Ahmet" değeri sıralamada yer değiştirse bile anahtarı hala "ogrenci1" olarak kalır.
  • ksort(): Anahtarlara (key) göre sıralar.

Örneğin, yukarıdaki ürünler listesini fiyata göre sıralamak isteseydik, usort() (User Defined Sort) adında, kendi yazdığımız bir fonksiyonu kullanan özel bir sıralama yöntemine başvururduk. Ama şimdilik kafanızı o kadar karıştırmayalım, temel sıralamalar çoğu zaman işinizi görecektir.

Array Filter ve Array Map: Modern Dokunuşlar

Son olarak, biraz daha ileri seviye ama "Cool" görünen iki fonksiyondan bahsetmek istiyorum. 2005'te bunlar pek popüler değildi ama bugün modern PHP'de çok sık kullanıyoruz.

array_filter(): Dizinin içinden istemediğiniz çöpleri ayıklamak için kullanılır. Mesela içinde boş değerler (null, "") olan bir diziyi temizlemek için birebirdir.

array_map(): Dizinin her bir elemanına topluca bir işlem yapmak için kullanılır. Örneğin elinizde fiyatların olduğu bir dizi var ve hepsine %18 KDV eklemek istiyorsunuz. Tek tek döngü kurmak yerine array_map ile tek satırda hepsini güncelleyebilirsiniz.

Dizilerle Çalışırken Yapılan Hatalar

Yıllardır edindiğim tecrübelere dayanarak, sizi şu konularda uyarmam gerek:

  1. Tanımsız Anahtar Hatası (Undefined Array Key): En sık görülen PHP hatasıdır. Olmayan bir anahtarı çağırmaya çalışmak. $profil['yas'] diye bir şey tanımlamadıysanız ve çağırmaya çalışırsanız PHP size kızar. Bunu önlemek için kullanmadan önce isset($profil['yas']) veya PHP 7+ ile gelen ?? operatörünü kullanın.
  2. Dizi ile String'i Karıştırmak: Bazen dalgınlıkla bir diziyi echo $dizi; diye yazdırmaya çalışırsınız. Ekranda sadece "Array" yazısını görürsünüz. Dizilerin içeriğini görmek için print_r() veya daha detaylısı var_dump() kullanmalısınız. Hatta ben geliştirme yaparken veriyi daha okunaklı görmek için <pre> etiketleri arasına alırım.

Pixel Lab® Notları: Performans ve Bellek

Bir diziyi tanımladığınızda, o dizi sunucunun RAM'inde (belleğinde) yer kaplar. 100 elemanlı bir dizi sorun değildir ama 1 milyon satırlık bir veriyi tek bir diziye atıp işlemeye çalışırsanız sunucunuz "Yeter artık" diyip bayrağı çekebilir (Memory Limit Exhausted). Bu yüzden çok büyük verilerle çalışırken dizileri parça parça işlemek veya Generator (Yield) yapısını kullanmak gerekir. Ama bu, çok daha ileri bir konu.

Kısacası, diziler candır ama onları hoyratça kullanmamak gerekir. İhtiyacınız olmayan verileri dizide tutmayın, işiniz bitince unset($dizi) ile belleği boşaltın. Temiz kod, temiz iş demektir.

Toparlarken

Diziler, programlamanın yapı taşlarıdır. Onları anlamak, veriyi yönetme sanatını anlamaktır. Nasıl ki ben ormanda kamp yaparken çantamı düzenli tutarak hayatta kalma konforumu artırıyorsam, siz de kodlarınızda dizileri doğru kullanarak projelerinizin sağlığını ve sürdürülebilirliğini artırabilirsiniz.

Bugün indeksli dizilerden girdik, çok boyutlu karmaşık yapılardan çıktık. Sepet mantığını kurduk, blog listesi hazırladık. Umarım bu yazı, PHP dizileri hakkındaki soru işaretlerini kafanızdan silmiştir. Bir sonraki yazıda, bu verileri kalıcı hale getirmeyi, yani veritabanı bağlantılarını konuşacağız. O zamana kadar, kodlarınız hatasız, kahveniz sıcak olsun. Doğayla kalın.

Yorumlar

Henüz yorum yapılmamış. İlk yorumu siz yazın!

Yorum Yaz

E-posta adresiniz yayınlanmayacaktır.
0 / 2000