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
381 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!

sumber:php.cn
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