PHP Dizileri: İndeksli, İlişkisel ve Çok Boyutlu Kullanım

PHP Dizileri: İndeksli, İlişkisel ve Çok Boyutlu Kullanım

4 dakika okuma

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:

PHP9 satır
$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

PHP9 satır
$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:

PHP9 satır
$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:

PHP9 satır
$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:

PHP6 satır
// 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.

PHP7 satır
$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.

PHP9 satır
// 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.

PHP7 satır
$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

  1. Kurulum ve temel sözdizimi
  2. Döngüler ve akış kontrolü
  3. Diziler (bu yazı)
  4. Fonksiyonlar
  5. String fonksiyonları
  6. Süper globaller
  7. Form işleme
  8. Dosya işlemleri

Dilin ayrıntıları

  1. Tip sistemi ve strict_types
  2. Hata ve istisna yönetimi
  3. Düzenli ifadeler
  4. Tarih ve saat işlemleri

Nesne yönelimli PHP

  1. Sınıf ve nesne
  2. Kalıtım, arayüz ve trait
  3. Statik üyeler, sabitler ve enum
  4. Namespace, Composer ve autoload

Veri ve güvenlik

  1. PDO ile veritabanı işlemleri
  2. Oturum yönetimi ve kimlik doğrulama
  3. Güvenli çıktı ve XSS
  4. JSON ile veri değişimi

Dış dünya ve üretim

  1. cURL ile dış API çağırma
  2. Kendi REST API'ni yazmak
  3. PHPUnit ile birim test
  4. Hata ayıklama ve performans ölçümü
  5. Üretime alma ve güvenlik

Yorumlar

Bu form reCAPTCHA ile korunur; Google Gizlilik Politikası ve Hizmet Şartları geçerlidir.

İlk yorumu sen yap.

İlgili Yazılar