Rumah > pembangunan bahagian belakang > tutorial php > Mengapakah Menggunakan Rujukan dalam Gelung `foreach` PHP Membawa kepada Pengubahsuaian Tatasusunan Tidak Dijangka?

Mengapakah Menggunakan Rujukan dalam Gelung `foreach` PHP Membawa kepada Pengubahsuaian Tatasusunan Tidak Dijangka?

Linda Hamilton
Lepaskan: 2024-12-16 09:24:17
asal
494 orang telah melayarinya

Why Does Using References in PHP's `foreach` Loop Lead to Unexpected Array Modifications?

Gelagat Rujukan dalam Gelung 'foreach': Memahami Pengubahsuaian Tatasusunan

Dalam PHP, menggunakan rujukan dalam gelung 'foreach' boleh membawa kepada perkara yang tidak dijangka pengubahsuaian tatasusunan. Tingkah laku ini diserlahkan dalam kod berikut:

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

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

print_r($a);
Salin selepas log masuk

Output yang dihasilkan oleh kod ini adalah tidak dijangka:

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

Penjelasan Langkah demi Langkah

Untuk memahami tingkah laku ini, adalah penting untuk mengikuti perubahan yang berlaku semasa setiap lelaran 'foreach' gelung:

  • Lelaran Pertama (Lelaran Rujukan): $v ialah rujukan kepada $a[0] ('a').
  • Lelaran Ke-2 (Lelaran Rujukan): $v ialah rujukan kepada $a[1] ('b').
  • Lelaran Ketiga (Lelaran Rujukan): $v ialah rujukan kepada $a[2] ('c').
  • Lelaran Ke-4 (Lelaran Rujukan): $v ialah rujukan kepada $a[3] ('d').

Setelah selesai gelung 'foreach' pertama (lelaran rujukan), $v masih memegang rujukan kepada $a[3] ('d').

  • Lelaran Pertama (Lelaran Nilai): $v (masih merujuk $a[3]) diberikan nilai $a[0] ('a'). Walau bagaimanapun, memandangkan $v ialah rujukan, ia mengubah suai $a[3] kepada 'a'.
  • Lelaran Kedua (Lelaran Nilai): $v (masih merujuk $a[3] ) diberikan nilai $a[1] ('b'). Ini sekali lagi mengubah suai $a[3] kepada 'b'.
  • Lelaran Ketiga (Lelaran Nilai): $v (masih merujuk $a[3]) diberikan nilai $a [2] ('c'). Ini mengubah suai $a[3] sekali lagi kepada 'c'.
  • Lelaran Ke-4 (Lelaran Nilai): $v (masih merujuk $a[3]) diberikan nilai $ a[3] ('c').

Oleh itu, selepas gelung 'foreach' kedua (lelaran nilai), tatasusunan $a telah diubah suai dengan 'c' muncul dua kali.

Menyelesaikan Isu

Untuk mengelakkan tingkah laku yang tidak dijangka ini, adalah disyorkan untuk menyahset rujukan selepas setiap lelaran :

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

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

print_r($a);
Salin selepas log masuk

Ini akan menghasilkan output yang dijangkakan:

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

Atas ialah kandungan terperinci Mengapakah Menggunakan Rujukan dalam Gelung `foreach` PHP Membawa kepada Pengubahsuaian Tatasusunan Tidak Dijangka?. 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