Mengapakah menggunakan rujukan pas dalam gelung `foreach` PHP mengubah suai tatasusunan selepas gelung berakhir?

Susan Sarandon
Lepaskan: 2024-11-13 09:19:02
asal
397 orang telah melayarinya

Why does using pass-by-reference in a PHP `foreach` loop modify the array after the loop ends?

PHP Foreach Pass melalui Rujukan dan Pengubahsuaian Tatasusunan

Dalam PHP, menggunakan rujukan lulus dalam gelung foreach boleh membawa kepada tingkah laku yang tidak dijangka. Pertimbangkan kod berikut:

$arr = ["foo", "bar", "baz"];

foreach ($arr as &$item) {}
// Array remains unchanged: ["foo", "bar", "baz"]

foreach ($arr as $item) {}
// Array is modified: ["foo", "bar", "bar"]
Salin selepas log masuk

Mengapakah gelung kedua mengubah suai tatasusunan?

Dalam gelung pertama, pembolehubah $item diluluskan melalui rujukan. Ini bermakna bahawa perubahan yang dibuat kepada $item juga mempengaruhi elemen yang sepadan dalam tatasusunan $arr. Walau bagaimanapun, dalam gelung kedua, $item diluluskan oleh nilai. Oleh itu, perubahan yang dibuat kepada $item tidak menjejaskan tatasusunan.

Yang penting, selepas gelung pertama, $item masih merujuk elemen terakhir $arr. Apabila gelung kedua berulang pada tatasusunan, setiap nilai $item menimpa elemen terakhir $arr kerana kedua-duanya merujuk kepada lokasi memori yang sama.

Menyahpepijat Output

Untuk memahami tingkah laku, kita boleh menggemakan nilai semasa $item dan mencetak secara rekursif tatasusunan $arr semasa setiap gelung lelaran.

Gelung Pertama:

foo
Array ( [0] => foo [1] => bar [2] => baz )

bar
Array ( [0] => foo [1] => bar [2] => baz )

baz
Array ( [0] => foo [1] => bar [2] => baz )
Salin selepas log masuk

Selepas gelung pertama, $item menghala ke elemen terakhir $arr.

Gelung Kedua:

foo
Array ( [0] => foo [1] => bar [2] => foo )

bar
Array ( [0] => foo [1] => bar [2] => bar )

bar
Array ( [0] => foo [1] => bar [2] => bar )
Salin selepas log masuk

Memandangkan setiap nilai $item ialah ditimpa, ia juga mengubah suai elemen terakhir $arr.

Adakah ia Pepijat?

Tidak, tingkah laku ini bukan pepijat tetapi sebaliknya tingkah laku pas yang dimaksudkan -dengan rujukan. Adalah penting untuk memahami implikasi menghantar pembolehubah melalui rujukan dan menggunakannya dengan sewajarnya.

Atas ialah kandungan terperinci Mengapakah menggunakan rujukan pas dalam gelung `foreach` PHP mengubah suai tatasusunan selepas gelung berakhir?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan