İ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 $itemgüncellendi $arr[3]. Döngü, dizinin üçüncü değerine ulaştığında, değeri baro 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.