İlk foreach döngüsünden sonra $item
, yine de tarafından kullanılan bazı değerlere bir referanstır $arr[2]
. Bu nedenle, ikinci döngüdeki her bir foreach çağrısı, referans olarak çağrılamaz, bu değeri ve dolayısıyla $arr[2]
yeni değeri değiştirir.
Yani döngü 1, değer ve $arr[2]
haline $arr[0]
, ki bu 'foo'.
Döngü 2, değer ve $arr[2]
haline $arr[1]
, 'bar'.
Döngü 3, 'bar' olan değer ve $arr[2]
haline $arr[2]
(döngü 2 nedeniyle).
'Baz' değeri aslında ikinci foreach döngüsünün ilk çağrısında kaybolur.
Çıktıda Hata Ayıklama
Döngünün her yinelemesi için $item
, diziyi yinelemeli olarak yazdırmanın yanı sıra değerini de yansıtacağız $arr
.
İlk döngü tamamlandığında, bu çıktıyı görüyoruz:
foo
Array ( [0] => foo [1] => bar [2] => baz )
bar
Array ( [0] => foo [1] => bar [2] => baz )
baz
Array ( [0] => foo [1] => bar [2] => baz )
Döngünün sonunda $item
, hala aynı yere işaret ediyor $arr[2]
.
İkinci döngü tamamlandığında, bu çıktıyı görüyoruz:
foo
Array ( [0] => foo [1] => bar [2] => foo )
bar
Array ( [0] => foo [1] => bar [2] => bar )
bar
Array ( [0] => foo [1] => bar [2] => bar )
Her dizinin nasıl yeni bir değer eklediğini fark edeceksiniz , ikisi de aynı yere işaret ettiğinden aynı değerle $item
güncellendi $arr[3]
. Döngü, dizinin üçüncü değerine ulaştığında, değeri bar
o döngünün önceki yinelemesi tarafından ayarlandığı için içerecektir .
Bu bir hata mı?
Hayır. Bu, başvurulan bir öğenin davranışıdır, bir hata değildir. Şunun gibi bir şey çalıştırmaya benzer:
for ($i = 0; $i < count($arr); $i++) { $item = $arr[$i]; }
Bir foreach döngüsü, başvurulan öğeleri yok sayabileceği özel bir özellik değildir. Basitçe, bu değişkeni her döngü dışında yaptığınız gibi yeni bir değere ayarlamaktır.