Rumah > pembangunan bahagian belakang > tutorial php > Mengapakah Gelung Foreach Rujukan PHP Menunjukkan Gelagat Tidak Dijangka?

Mengapakah Gelung Foreach Rujukan PHP Menunjukkan Gelagat Tidak Dijangka?

Barbara Streisand
Lepaskan: 2024-12-13 12:57:10
asal
1022 orang telah melayarinya

Why Does PHP's Referenced Foreach Loop Exhibit Unexpected Behavior?

Memahami Gelagat Pelik bagi Gelung Foreach Rujukan PHP

Dalam PHP, gelung foreach berulang ke atas elemen dalam tatasusunan atau objek. Walau bagaimanapun, apabila menggunakan rujukan dalam gelung (cth., foreach ($a sebagai &$v) { ... }), tingkah laku yang tidak dijangka boleh berlaku.

Masalahnya

Pertimbangkan skrip PHP berikut:

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

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

print_r($a);
Salin selepas log masuk

Dijangka Output:

Suatu tatasusunan dengan elemen 'a', 'b', 'c' dan 'd'.

Output Sebenar:

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

Penjelasan

Tingkah laku yang tidak dijangka timbul kerana rujukan dicipta dalam gelung foreach berterusan selepas gelung ditamatkan. Khususnya, elemen terakhir dalam tatasusunan $a masih boleh dirujuk oleh pembolehubah $v.

Apabila gelung foreach kedua dijalankan, $v (rujukan kepada elemen terakhir dalam $a) ditetapkan semula nilai setiap elemen dalam tatasusunan. Memandangkan $v ialah rujukan kepada elemen terakhir dalam $a, elemen tatasusunan yang sepadan diubah suai.

Resolusi

Untuk mengelakkan tingkah laku ini, sentiasa nyahset pembolehubah rujukan selepas gelung foreach selesai:

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

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

print_r($a);
Salin selepas log masuk

Output:

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

Atas ialah kandungan terperinci Mengapakah Gelung Foreach Rujukan PHP Menunjukkan Gelagat 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