Setelah loop foreach pertama, $item
masih referensi ke beberapa nilai yang juga digunakan oleh $arr[2]
. Jadi setiap panggilan foreach di loop kedua, yang tidak memanggil dengan referensi, menggantikan nilai itu, dan dengan demikian $arr[2]
, dengan nilai baru.
Jadi loop 1, nilainya dan $arr[2]
menjadi $arr[0]
, yaitu 'foo'.
Loop 2, nilai dan $arr[2]
menjadi $arr[1]
, yang merupakan 'bar'.
Loop 3, nilai dan $arr[2]
menjadi $arr[2]
, yang merupakan 'bar' (karena loop 2).
Nilai 'baz' sebenarnya hilang pada panggilan pertama dari loop foreach kedua.
Debugging Output
Untuk setiap iterasi dari loop, kami akan menggema nilai $item
serta mencetak array secara rekursif $arr
.
Ketika loop pertama dijalankan, kita melihat output ini:
foo
Array ( [0] => foo [1] => bar [2] => baz )
bar
Array ( [0] => foo [1] => bar [2] => baz )
baz
Array ( [0] => foo [1] => bar [2] => baz )
Di akhir perulangan, $item
masih menunjuk ke tempat yang sama dengan $arr[2]
.
Ketika loop kedua dijalankan, kita melihat output ini:
foo
Array ( [0] => foo [1] => bar [2] => foo )
bar
Array ( [0] => foo [1] => bar [2] => bar )
bar
Array ( [0] => foo [1] => bar [2] => bar )
Anda akan melihat bagaimana setiap array waktu memasukkan nilai baru $item
, juga diperbarui $arr[3]
dengan nilai yang sama, karena keduanya masih menunjuk ke lokasi yang sama. Ketika loop sampai ke nilai ketiga dari array, itu akan berisi nilai bar
karena hanya diatur oleh iterasi sebelumnya dari loop itu.
Apakah ini bug?
Tidak. Ini adalah perilaku dari item yang dirujuk, dan bukan bug. Ini akan mirip dengan menjalankan sesuatu seperti:
for ($i = 0; $i < count($arr); $i++) { $item = $arr[$i]; }
Loop foreach tidak bersifat khusus di mana ia dapat mengabaikan item yang direferensikan. Ini hanya mengatur variabel itu ke nilai baru setiap kali seperti yang Anda lakukan di luar loop.