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"]
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 )
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 )
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!