
PHP Dizileri: İndeksli, İlişkisel ve Çok Boyutlu Kullanım
PHP'de dizi, hem klasik liste hem de anahtar değer haritası olarak çalışan tek bir yapıdır. Bu esneklik pratik olsa da, hangi biçimin kullanıldığının bilinmesi gerekir; çünkü arama, sıralama ve bellek davranışı buna göre değişir.
PHP dizisi arka planda sıralı bir haritadır. Bu nedenle eleman silindiğinde anahtarlar kendiliğinden yeniden numaralanmaz ve dizinin JSON çıktısı liste yerine nesne haline gelebilir. Aşağıdaki bölümlerde bu davranışın pratikte nerelere dokunduğu ele alınıyor.
İndeksli ve ilişkisel diziler
İndeksli dizide anahtarlar sıfırdan başlayan tam sayılardır. İlişkisel dizide anahtar metin olur ve veriye isimle erişilir:
$renkler = ['kırmızı', 'yeşil', 'mavi'];
echo $renkler[1];
$kullanici = [
'ad' => 'Ayşe',
'rol' => 'editor',
'aktif' => true,
];
echo $kullanici['rol'];Var olmayan bir anahtara erişmek uyarı üretir. Erişimden önce isset ya da null birleştirme operatörü kullanılır: $kullanici['telefon'] ?? ''.
Eleman ekleme, çıkarma ve birleştirme
$liste = [];
$liste[] = 'ilk';
$liste[] = 'ikinci';
array_push($liste, 'üçüncü');
$son = array_pop($liste);
$ilk = array_shift($liste);
$birlesik = [...$liste, ...$digerListe];Üç nokta ile yayma operatörü, array_merge'e göre daha okunur bir birleştirme sağlar. İlişkisel dizilerde aynı anahtar iki kez geçerse sonraki değer önceki değerin üzerine yazılır.
Sık kullanılan dizi fonksiyonları
Dizi işlemlerinin büyük kısmı döngü yazmadan çözülebilir. Bu fonksiyonlar hem kısa hem de niyeti açık ifade eder:
$aktifler = array_filter($kullanicilar, fn(array $k): bool => $k['aktif']);
$adlar = array_map(fn(array $k): string => $k['ad'], $kullanicilar);
$idler = array_column($kullanicilar, 'id');
$toplam = array_sum(array_column($siparisler, 'tutar'));
usort($kullanicilar, fn(array $a, array $b): int => $a['ad'] <=> $b['ad']);array_filter anahtarları korur; sonucu yeniden indekslemek için array_values kullanılır. Bu ayrıntı JSON çıktısında dizinin nesneye dönüşmesine yol açtığı için sık sorun çıkarır.
Çok boyutlu diziler
Veritabanı sonuçları genellikle satırların dizisi biçiminde gelir. Bu yapıda gezerken iç dizinin anahtarlarının var olduğundan emin olmak gerekir:
$satirlar = [
['id' => 1, 'ad' => 'Ayşe', 'sehir' => 'Antalya'],
['id' => 2, 'ad' => 'Mert', 'sehir' => 'İzmir'],
];
$sehreGore = [];
foreach ($satirlar as $satir) {
$sehreGore[$satir['sehir']][] = $satir['ad'];
}Aramada performans farkı
Bir değerin dizide bulunup bulunmadığını kontrol etmenin iki yolu vardır ve aralarındaki fark büyük dizilerde belirginleşir. in_array diziyi baştan sona tarar, isset ise anahtara doğrudan erişir:
// değer araması: dizi büyüdükçe yavaşlar
in_array($id, $idler, true);
// anahtar araması: dizi boyutundan bağımsız
$harita = array_flip($idler);
isset($harita[$id]);Karşılaştırmalarda üçüncü parametrenin true verilmesi tip kontrolünü de zorunlu kılar. Aksi halde metin ile sayı eşit sayılabilir.
Diziyi sıralamak
Sıralama fonksiyonları iki gruba ayrılır: anahtarları koruyanlar ve korumayanlar. sort ve usort diziyi yeniden numaralandırır; ilişkisel dizide kullanıldığında anahtarlar kaybolur. asort, ksort ve uasort ise anahtar değer eşleşmesini bozmaz.
$puanlar = ['ayse' => 88, 'mert' => 95, 'zehra' => 72];
asort($puanlar); // değere göre, anahtarlar korunur
ksort($puanlar); // anahtara göre
// çok boyutlu dizide alana göre sıralama
usort($kullanicilar, fn(array $a, array $b): int => $b['puan'] <=> $a['puan']);Karşılaştırma işlevi negatif, sıfır ya da pozitif değer döndürmelidir. Uzay gemisi operatörü bu üç durumu tek satırda ürettiği için elle yazılan karşılaştırmalara göre hem kısa hem hatasızdır.
Bellek ve büyük diziler
Bir dizinin tamamını belleğe almak, veri kümesi büyüdüğünde bellek sınırına takılmanın en yaygın nedenidir. Dosya ya da veritabanı satırları üzerinde çalışırken tüm sonucu diziye doldurmak yerine satır satır işlemek gerekir.
// tüm dosyayı belleğe alır
$satirlar = file('kayit.csv');
// satır satır okur, bellek sabit kalır
$fp = fopen('kayit.csv', 'r');
while (($satir = fgetcsv($fp)) !== false) {
isle($satir);
}
fclose($fp);Üretilen değerler üzerinde gezinmek gerektiğinde generator kullanmak da diziye göre çok daha az bellek tüketir. yield ile değer döndüren fonksiyon, sonucu tek seferde oluşturmak yerine istendikçe üretir.
Diziyi JSON olarak çıkarmak
Bir dizi json_encode ile çıkarıldığında, anahtarları sıfırdan başlayan ardışık tam sayılarsa JSON dizisi, aksi halde JSON nesnesi üretilir. array_filter sonrası anahtarlar boşluklu kaldığı için beklenen liste yerine nesne dönmesi sık karşılaşılan bir sorundur.
$aktifler = array_filter($kullanicilar, fn(array $k): bool => $k['aktif']);
// anahtarlar 0,2,5 kaldığı için nesne üretir
echo json_encode($aktifler);
// yeniden indeksleyince dizi üretir
echo json_encode(array_values($aktifler));Türkçe karakterlerin kaçış kodlarına dönüşmemesi için JSON_UNESCAPED_UNICODE bayrağı eklenir. Okunabilir çıktı gerekiyorsa JSON_PRETTY_PRINT ile birlikte kullanılır.
Kontrol listesi
- Anahtara erişmeden önce varlığı kontrol edilir.
- array_filter sonrası gerekiyorsa array_values ile yeniden indekslenir.
- Karşılaştırma fonksiyonlarında katı tip kontrolü açılır.
- Tekrarlanan aramalarda dizi anahtara göre indekslenir.
- Büyük veri kümelerinde diziyi tamamen belleğe almak yerine parça parça işlemek tercih edilir.
PHP eğitim serisi
Bu yazı, temel sözdiziminden üretim ortamına kadar ilerleyen 25 bölümlük serinin bir parçası. Bölümler sırayla okunacak biçimde hazırlandı, ancak her biri tek başına da kullanılabilir.
Temeller
- Kurulum ve temel sözdizimi
- Döngüler ve akış kontrolü
- Diziler (bu yazı)
- Fonksiyonlar
- String fonksiyonları
- Süper globaller
- Form işleme
- Dosya işlemleri
Dilin ayrıntıları
Nesne yönelimli PHP
- Sınıf ve nesne
- Kalıtım, arayüz ve trait
- Statik üyeler, sabitler ve enum
- Namespace, Composer ve autoload
Veri ve güvenlik
- PDO ile veritabanı işlemleri
- Oturum yönetimi ve kimlik doğrulama
- Güvenli çıktı ve XSS
- JSON ile veri değişimi
Dış dünya ve üretim
Yorumlar
İlk yorumu sen yap.
İlgili Yazılar

PHP Uygulamasını Üretime Almak: Yapılandırma ve Güvenlik
Geliştirme makinesinde çalışan kod ile üretimde güvenle çalışan kod arasındaki fark yapılandırmadır. Ayarlar, izinler, dağıtım akışı ve son kontroller.

PHP ile REST API Yazmak: Yönlendirme ve HTTP Durum Kodları
Bir API'nin kalitesi çoğunlukla ayrıntılarda belli olur: doğru durum kodu, tutarlı hata biçimi ve öngörülebilir adresler. Saf PHP ile uçtan uca kurulum.

PHPUnit ile Birim Test Yazmak: Kurulum, Sahte Nesneler ve Kapsam
Testin amacı hata bulmak değil, değişikliği güvenle yapabilmektir. Kurulum, ilk test, sahte nesneler ve test edilebilir kodun özellikleri.