Rumah >pembangunan bahagian belakang >tutorial php >Mengapakah Menggunakan Rujukan dalam Gelung `foreach` PHP Tanpa Dijangka Mengubah Suai Elemen Tatasusunan Terakhir?

Mengapakah Menggunakan Rujukan dalam Gelung `foreach` PHP Tanpa Dijangka Mengubah Suai Elemen Tatasusunan Terakhir?

Barbara Streisand
Barbara Streisandasal
2024-12-21 11:53:17150semak imbas

Why Does Using References in PHP's `foreach` Loop Unexpectedly Modify the Last Array Element?

foreach dengan Rujukan (Foreach dengan &)

Dalam PHP, menggunakan rujukan dalam gelung foreach membawa implikasi yang perlu diketahui oleh pengguna. Konsep ini boleh dilihat dalam coretan kod berikut:

<br>$a = array('a', 'b', 'c', 'd');</p>
<p>foreach ($a sebagai &$v) { }<br>foreach ($a sebagai $v) { }</p>
<p>print_r($a);<br>

Kod ini kelihatan mudah, tetapi kelakuannya mungkin kelihatan membingungkan bagi sesetengah orang. Selepas melaksanakan gelung pertama, nilai dalam tatasusunan $a kekal tidak berubah. Walau bagaimanapun, dalam gelung seterusnya, elemen terakhir $a secara tidak dijangka ditimpa dengan nilai 'a', 'b' dan 'c'. Ini disebabkan oleh tingkah laku penting dalam gelung foreach PHP apabila menggunakan rujukan (ditandakan dengan simbol ampersand (&)).

Rujukan dan Pengubahsuaian Elemen Terakhir

Oleh menggunakan rujukan & dalam gelung pertama, $v menjadi alias untuk elemen semasa yang dilalui dalam tatasusunan. Apabila perubahan dibuat kepada $v, ia mengubah suai elemen asal dalam $a dengan berkesan. Dalam kes ini, gelung ketiga berulang pada tatasusunan, dan walaupun $v bukan lagi rujukan, ia masih menunjuk kepada elemen terakhir tatasusunan yang bermutasi ($a[3]) dan menimpanya dengan nilai daripada lelaran sebelumnya .

Amaran PHP

Tingkah laku pelik ini didokumenkan dalam PHP manual:

Amaran: Rujukan $value dan elemen tatasusunan terakhir kekal walaupun selepas gelung foreach. Adalah disyorkan untuk memusnahkannya dengan unset().

Untuk mengelakkan tingkah laku yang tidak dijangka, pertimbangkan untuk memusnahkan rujukan dengan unset() seperti yang ditunjukkan di bawah:

<br>$a = tatasusunan('a', 'b', 'c', 'd');</p>
<p>foreach ($a sebagai &$v) { }<br>unset($v);<br>foreach ($a sebagai $v) { }</p>
<p>print_r($a);<br>

Oleh menyahset rujukan secara eksplisit, anda memastikan gelung berikutnya beroperasi pada nilai asal dalam tatasusunan. Pendekatan ini menghalang pengubahsuaian yang tidak diingini pada kandungan tatasusunan.

Atas ialah kandungan terperinci Mengapakah Menggunakan Rujukan dalam Gelung `foreach` PHP Tanpa Dijangka Mengubah Suai Elemen Tatasusunan Terakhir?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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