İçeriğe geç
Educora
Başlangıç16 dk4 / 10

Diziler ve foreach

İndisli, ilişkisel ve çok boyutlu diziler oluştur, onları foreach ile dolaş, sırala; dizileri ayrıştırmayı ve birleştirmeyi öğren.

Kendini test et
Bu derste öğreneceklerin
  • İndisli, ilişkisel ve çok boyutlu diziler oluşturmak ve elemanlarına erişmek
  • Dizileri foreach ile dolaşmak ve count, implode, array_column gibi fonksiyonları kullanmak
  • Dizileri sıralamak, ayrıştırmak (destructuring) ve ... ile birleştirmek

Bir sınıfta 25 öğrenci var ve her birinin notlarını saklaman gerekiyor. 25 ayrı değişken mi oluşturacaksın? Elbette hayır. İşte burada dizi işe yarar: birçok değeri tek bir ad altında tutan bir yapı. PHP'de dizi hem liste hem de sözlük görevi görür; bu yüzden neredeyse her betikte karşına çıkar.

İndisli diziler

Bir dizi köşeli parantezlerle oluşturulur: ["Baku", "Ganja"]. Elemanlar 0'dan başlayan indislerle numaralandırılır. $cities[] = ... yazımı dizinin sonuna yeni bir eleman ekler, count eleman sayısını döndürür, print_r ise dizinin tüm içeriğini gösterir.

PHP
<?php

$cities = ["Baku", "Ganja", "Sumgait"];
$cities[] = "Shaki";

echo $cities[0], "\n";
echo count($cities), "\n";
echo $cities[count($cities) - 1], "\n";
print_r($cities);
echo implode(", ", $cities), "\n";
Beklenen çıktı
Baku
4
Shaki
Array
(
    [0] => Baku
    [1] => Ganja
    [2] => Sumgait
    [3] => Shaki
)
Baku, Ganja, Sumgait, Shaki

implode, dizinin elemanlarını verilen ayırıcıyla tek bir dizede birleştirir; explode ise tersini yapar: bir dizeyi ayırıcıya göre bölerek diziye çevirir. Var olmayan bir indise erişirsen PHP 8 Undefined array key uyarısı verir ve null döndürür.

İlişkisel diziler ve foreach

İlişkisel dizide numaralar yerine anlamlı anahtarlar kullanılır: "name" => "Leyla". Bu, tek bir şeyle ilgili bilgileri saklamak için kullanışlıdır. **foreach** döngüsü dizinin her elemanını dolaşır: foreach ($arr as $value) yalnızca değerleri, foreach ($arr as $key => $value) ise anahtarları da verir. Bir anahtarın var olup olmadığı isset ya da array_key_exists ile denetlenir.

PHP
<?php

$student = [
    "name" => "Leyla",
    "age" => 14,
    "city" => "Baku",
];
$student["grade"] = 8;

echo "{$student['name']} is {$student['age']} years old\n";
var_dump(isset($student["email"]));
var_dump(array_key_exists("city", $student));

foreach ($student as $key => $value) {
    echo "$key: $value\n";
}
Beklenen çıktı
Leyla is 14 years old
bool(false)
bool(true)
name: Leyla
age: 14
city: Baku
grade: 8

Çok boyutlu diziler

Bir dizinin elemanı başka bir dizi de olabilir. Veritabanından gelen sonuçlar genellikle tam olarak böyle görünür: satırlardan oluşan bir liste, her satır da ilişkisel bir dizidir. array_column tüm satırlardan tek bir sütunu çeker.

PHP
<?php

$students = [
    ["name" => "Aysel", "marks" => [5, 4, 5]],
    ["name" => "Murad", "marks" => [4, 4, 3]],
    ["name" => "Elvin", "marks" => [5, 5, 5]],
];

foreach ($students as $student) {
    $avg = array_sum($student["marks"]) / count($student["marks"]);
    echo $student["name"] . ": " . round($avg, 1) . "\n";
}

echo $students[1]["marks"][2], "\n";
echo implode(", ", array_column($students, "name")), "\n";
Beklenen çıktı
Aysel: 4.7
Murad: 3.7
Elvin: 5
3
Aysel, Murad, Elvin

Sıralama ve kullanışlı fonksiyonlar

PHP
<?php

$prices = ["bread" => 0.8, "milk" => 1.9, "cheese" => 7.5, "tea" => 4.2];

echo count($prices), "\n";
echo array_sum($prices), "\n";
echo max($prices), "\n";
var_dump(in_array(1.9, $prices));
echo implode(", ", array_keys($prices)), "\n";

asort($prices);
echo implode(", ", array_keys($prices)), "\n";
arsort($prices);
echo array_key_first($prices), "\n";

$colors = explode(",", "red,green,blue");
sort($colors);
print_r($colors);
Beklenen çıktı
4
14.4
7.5
bool(true)
bread, milk, cheese, tea
bread, milk, tea, cheese
cheese
Array
(
    [0] => blue
    [1] => green
    [2] => red
)
FonksiyonNeye göre sıralarAnahtarlar
sort / rsortdeğer, artan / azalanyeniden numaralanır
asort / arsortdeğer, artan / azalankorunur
ksort / krsortanahtar, artan / azalankorunur
usortkendi karşılaştırma fonksiyonun (sonraki ders)yeniden numaralanır
Tüm sıralama fonksiyonları diziyi yerinde değiştirir ve yeni bir dizi döndürmez.

Ayrıştırma ve yayma

Bir dizinin elemanlarını tek satırda ayrı değişkenlere yazabilirsin: [$a, $b] = $pair; — buna ayrıştırma (destructuring) denir. İlişkisel dizide anahtarları belirtirsin. Yayma operatörü ... ise bir dizinin elemanlarını başka bir dizinin içine “döker”.

PHP
<?php

[$first, $second] = ["gold", "silver"];
echo "$first, $second\n";

$a = 1;
$b = 2;
[$a, $b] = [$b, $a];
echo "a=$a b=$b\n";

["name" => $name, "city" => $city] = ["name" => "Nigar", "city" => "Shaki"];
echo "$name lives in $city\n";

$morning = ["tea", "bread"];
$evening = ["soup", "salad"];
$menu = [...$morning, ...$evening, "cake"];
echo implode(" + ", $menu), "\n";
Beklenen çıktı
gold, silver
a=2 b=1
Nigar lives in Shaki
tea + bread + soup + salad + cake
Eski üslup
$user = array('name' => 'Aysel', 'age' => 15);
list($x, $y) = $point;
$all = array_merge($boys, $girls);
Modern PHP
$user = ['name' => 'Aysel', 'age' => 15];
[$x, $y] = $point;
$all = [...$boys, ...$girls];
array() ve list() hâlâ çalışır, ancak yeni kodda kısa [] yazımı standarttır.

Önemli noktalar

  • İndisli dizinin elemanları 0'dan numaralanır; $arr[] = $x sona eleman ekler, count boyutu verir.
  • İlişkisel dizi anahtar => değer çiftlerini saklar; foreach ($arr as $key => $value) ikisini de verir.
  • Çok boyutlu diziler tablo gibidir; array_column tek bir sütunu çıkarır.
  • sort anahtarları siler, asort ve ksort korur; sıralama fonksiyonları diziyi yerinde değiştirir.
  • [$a, $b] = $arr bir diziyi ayrıştırır, [...$a, ...$b] ise dizileri birleştirir.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
$a = [10, 20, 30]; echo $a[1]; ne yazdırır?