Rumah > pembangunan bahagian belakang > tutorial php > Mengapa Gelung Foreach PHP dengan Rujukan Mengganti Elemen Tatasusunan Terakhir?

Mengapa Gelung Foreach PHP dengan Rujukan Mengganti Elemen Tatasusunan Terakhir?

Mary-Kate Olsen
Lepaskan: 2024-12-27 14:37:14
asal
431 orang telah melayarinya

Why Does PHP's Foreach Loop with References Overwrite the Last Array Element?

Gelagat Foreach yang Tidak Dijangka Menggunakan Rujukan

Apabila menggunakan gelung foreach PHP dengan rujukan, tingkah laku aneh boleh berlaku seperti yang ditunjukkan oleh coretan kod berikut :

$a = array('a', 'b', 'c', 'd');

foreach ($a as &$v) { }
foreach ($a as $v) { }

print_r($a);
Salin selepas log masuk

Kod ini bertujuan untuk berulang melalui tatasusunan $a menggunakan pembolehubah rujukan $v dalam gelung pertama dan pembolehubah bukan rujukan $v dalam gelung kedua. Walau bagaimanapun, yang menghairankan, output menunjukkan bahawa elemen terakhir tatasusunan, 'd', telah ditimpa:

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => c
)
Salin selepas log masuk

Penjelasan Perilaku

Ini yang tidak dijangka tingkah laku didokumentasikan dengan baik dalam dokumentasi PHP. Ia memberi amaran bahawa apabila menggunakan rujukan dalam gelung foreach, rujukan elemen terakhir tatasusunan kekal walaupun selepas gelung telah tamat. Untuk mengelakkan isu ini, adalah disyorkan untuk menyahset pembolehubah rujukan menggunakan unset().

Dalam contoh kami, pembolehubah rujukan $v kekal sebagai rujukan kepada elemen terakhir $a selepas gelung pertama. Apabila gelung kedua berulang melebihi $a, setiap lelaran gelung menetapkan semula nilai kepada $v. Walau bagaimanapun, memandangkan $v ialah rujukan kepada elemen terakhir $a, ia menimpa nilai elemen tersebut.

Panduan Langkah demi Langkah untuk Tingkah Laku

Untuk menjelaskan lebih lanjut, berikut ialah panduan langkah demi langkah tentang perkara yang berlaku dalam kod kami coretan:

  1. Gelung foreach pertama memberikan rujukan setiap elemen tatasusunan kepada $v.
  2. Dalam gelung foreach kedua, $v masih merujuk kepada elemen terakhir $a, ' d'.
  3. Gelung berulang melalui $a, menetapkan semula setiap nilai kepada $v.
  4. Memandangkan $v ialah rujukan kepada elemen terakhir $a, ia menimpa nilai elemen itu dengan setiap lelaran.
  5. Elemen terakhir $a akhirnya akan ditimpa dengan nilai sebelumnya elemen.

Penyelesaian

Untuk mengelakkan isu ini, cuma nyahset pembolehubah rujukan $v selepas gelung pertama:

foreach ($a as &$v) { }
unset($v);
foreach ($a as $v) { }
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa Gelung Foreach PHP dengan Rujukan Mengganti Elemen Tatasusunan Terakhir?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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