foreach

(PHP 4, PHP 5, PHP 7)

foreach yapısı diziler üzerinde yineleme yapmayı kolaylaştırmaktadır. foreach yalnızca diziler ve nesneler için kullanılabilir; farklı veri türünde veya ilklendirilmemiş bir değişken ile kullanmak istediğinizde hata verir. İki sözdizimi mevcuttur:

foreach (dizi_ifadesi as $değer)
    deyim
foreach (dizi_ifadesi as $isim => $değer)
    deyim

İlk sözdizimi dizi_ifadesi ile belirtilen dizinin üzerinde döngü oluşturur. Her yinelemede, sırası gelen elemanın değeri $değer değişkenine atanır ve dizi göstericisi bir arttırılır (böylece bir sonraki yinelemede dizinin bir sonraki elemanına bakılması sağlanmış olur).

İkinci yöntem de aynı şeyi yapar, ek olarak her yinelemede sırası gelen elemanın anahtarı $isim değişkenine atanır.

PHP 5'den itibaren, nesneleri yinelemek mümkün olmuştur.

Bilginize:

PHP 5'te foreach ilk çalışmaya başladığında, dizi göstericisi özdevinimli olarak ilk elemanı gösterecek biçimde sıfırlanır. Bu sebeple, foreach deyiminden önce reset() işlevini çalıştırmanıza gerek yoktur.

PHP 5'te foreach'in dahili bir dizi göstericisi ile çalışması nedeniyle bunun döngü içinde değiştirilmesi beklenmedik sonuçlara yol açabilir.

PHP 7'de, foreach dahili dizi göstericisi kullanmaz.

$değer değişkeninin önüne & koyarak dizi elemanları üzerinde kolayca değişiklik yapılabilir. Böylece değer gönderimli hale gelir.

<?php
$dizi 
= array(1234);
foreach (
$dizi as &$değer) {
    
$değer $değer 2;
}
// $dizi artık array(2, 4, 6, 8) olmuştur
unset($değer); // son eleman da işlendiğine göre gönderimi kaldıralım
?>

Uyarı

$değer gönderim için kullanıldığından foreach döngüsünün sonunda son dizi elemanına gönderimli olarak kalır, bu bakımdan döngünün sonunda bu gönderimin unset() işlevi kullanılarak kaldırılması önerilir. Yoksa aşağıdaki davranışla karşılaşırsınız:

<?php
$dizi 
= array("bir""iki""üç");
foreach (
$arr as &$value) {
    
değer değer 2;
}
// $dizi şimdi array(2, 4, 6, 8)

// unset($değer) olmaksızın, $değer hala son öğeye gösterimli olur: $dizi[3]

foreach ($dizi as $key => $değer) {
    
// $dizi[3] artık $dizi içindeki her değerle güncellenecek
    
echo "{$key} => {$değer} ";
    
print_r($dizi);
 }
// ...ikinciden son değere kadar son değere kopyalanacak.

// çıktı:
// 0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 )
// 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 )
// 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
// 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
?>

PHP 5.5.0 öncesinde, $değer sadece yinelenen dizi gösterimli (yanı bir değişken) olabiliyorsa gösterimli olur. Aşağıdaki kod sadece PHP 5.5.0 ve sonrasında çalışır:

<?php
foreach (array(1234) as &$değer) {
    
$değer $değer 2;
}
?>

Bilginize:

foreach '@' kullanarak hata iletilerini göstermeme yeteneğini desteklemez.

Değişik kullanımlara örnekler:

<?php
/* foreach örneği 1: yalnızca değer */

$a = array(12317);

foreach (
$a as $v) {
   echo 
"\$a değişkeninin şu anki değeri: $v.\n";
}

/* foreach örneği 2: değer (örnek olması için anahtar
 *  ile birlikte yazdırılmıştır) */

$a = array(12317);

$i 0/* yalnızca örnekleme için */

foreach ($a as $v) {
    echo 
"\$a[$i] => $v.\n";
    
$i++;
}

/* foreach örneği 3: anahtar ve değer */

$a = array(
    
"bir" => 1,
    
"iki" => 2,
    
"üç"  => 3,
    
"on yedi" => 17
);

foreach (
$a as $k => $v) {
    echo 
"\$a[$k] => $v.\n";
}

/* foreach örneği 4: çok boyutlu diziler */
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";

foreach (
$a as $v1) {
    foreach (
$v1 as $v2) {
        echo 
"$v2\n";
    }
}

/* foreach örneği 5: devingen diziler */

foreach (array(12345) as $v) {
    echo 
"$v\n";
}
?>

İç içe dizilerin list() ile ayrıştırılması

(PHP 5 >= 5.5.0, PHP 7)

PHP 5.5 ile yeni bir yetenek eklendi. Dizi dizileri üzerinde döngü oluşturmak ve list() işlevini değer olarak kullanmak suretiyle içteki diziyi döngü değişkenlerine atayarak onu da açmak artık mümkündür.

Örneğin:

<?php
$dizi 
= [
    [
12],
    [
34],
];

foreach (
$dizi as list($a$b)) {
    
// $a içteki dizinin ilk elemanını,
    // $b ikinci elemanını içerecektir.
    
echo "A: $a; B: $b\n";
}
?>

Yukarıdaki örneğin çıktısı:

A: 1; B: 2
A: 3; B: 4

İçteki dizinin gerekmeyen elemanlarını list() içinde içermeyebilirsiniz:

<?php
$dizi 
= [
    [
12],
    [
34],
];

foreach (
$dizi as list($a)) {
    
// Burada artık $b yok.
    
echo "$a\n";
}
?>

Yukarıdaki örneğin çıktısı:

1
3

list() için yeterli sayıda dizi elemanı yoksa bir uyarı üretilir.:

<?php
$dizi 
= [
    [
12],
    [
34],
];

foreach (
$dizi as list($a$b$c)) {
    echo 
"A: $a; B: $b; C: $c\n";
}
?>

Yukarıdaki örneğin çıktısı:


Notice: Undefined offset: 2 in example.php on line 7
A: 1; B: 2; C:

Notice: Undefined offset: 2 in example.php on line 7
A: 3; B: 4; C:

Sürüm Bilgisi

Sürüm: Açıklama
7.0.0 foreach artık dahili dizi göstericisini kullanmıyor.
5.5.0 $değer'i gösterimli yapmak ifadeler için de destekleniyor, evvelce sadece değişkenler için desteklenirdi.
5.5.0 list() ile içiçe dizilerin açılması destekleniyor.