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
Mary-Kate Olsenasal
2024-12-27 14:37:14360semak imbas

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);

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
)

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) { }

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