Rumah > pembangunan bahagian belakang > tutorial php > Mengapakah gelung foreach PHP saya dengan rujukan lulus mengubah tatasusunan saya secara tidak dijangka?

Mengapakah gelung foreach PHP saya dengan rujukan lulus mengubah tatasusunan saya secara tidak dijangka?

Barbara Streisand
Lepaskan: 2024-11-13 10:54:02
asal
572 orang telah melayarinya

Why does my PHP foreach loop with pass-by-reference change my array unexpectedly?

Plus Foreach PHP dengan Rujukan: Penduaan Elemen Terakhir? (Pepijat?)

Memahami Isu

Pertimbangkan kod PHP berikut:

$arr = array("foo", "bar", "baz");

foreach ($arr as &$item) {}
print_r($arr);

foreach ($arr as $item) {}
print_r($arr); // $arr has changed to ["foo", "bar", "bar"]
Salin selepas log masuk

Selepas gelung pertama, tatasusunan dicetak seperti yang dijangkakan:

Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)
Salin selepas log masuk

Walau bagaimanapun, selepas gelung kedua, tatasusunan berubah tanpa diduga:

Array
(
    [0] => foo
    [1] => bar
    [2] => bar
)
Salin selepas log masuk

Penjelasan

Isu timbul kerana gelung foreach pertama melepasi $item melalui rujukan. Ini bermakna $item ialah alias untuk elemen dalam tatasusunan $arr. Dalam gelung pertama, tiada perubahan dibuat kepada $item atau $arr.

Walau bagaimanapun, gelung kedua melepasi $item mengikut nilai. Apabila nilai $item diberikan nilai baharu dalam gelung, elemen sepadan dalam $arr juga diubah suai.

Secara khusus, elemen ketiga $arr ("baz") ditimpa dengan nilai elemen kedua ("bar") semasa lelaran terakhir gelung kedua. Ini menerangkan sebab elemen terakhir $arr diduplikasi selepas gelung kedua.

Adakah Ia Pepijat?

Tidak, tingkah laku ini bukan pepijat. Ia adalah tingkah laku yang dimaksudkan untuk setiap gelung apabila menghantar pembolehubah melalui rujukan. Adalah penting untuk mengetahui tingkah laku ini untuk mengelakkan perubahan yang tidak dijangka dalam tatasusunan anda.

Menyahpepijat Output

Untuk membantu menggambarkan gelagat, kod berikut menambah pernyataan gema untuk mencetak nilai $item dan tatasusunan $arr selepas setiap lelaran gelung:

echo "<br>";

foreach ($arr as &$item) {
    echo "Item: $item; Arr: ";
    print_r($arr);
    echo "<br>";
}

echo "<br>";

foreach ($arr as $item) {
    echo "Item: $item; Arr: ";
    print_r($arr);
    echo "<br>";
}
Salin selepas log masuk

Output menunjukkan cara $item dan $arr berubah semasa gelung, dengan jelas menggambarkan tingkah laku yang diterangkan di atas.

Atas ialah kandungan terperinci Mengapakah gelung foreach PHP saya dengan rujukan lulus mengubah tatasusunan saya secara 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