Mengapa Elemen Terakhir Mendua dalam Gelung Foreach PHP dengan Rujukan Laluan?

Linda Hamilton
Lepaskan: 2024-11-16 19:08:02
asal
772 orang telah melayarinya

Why Does the Last Element Duplicate in PHP's Foreach Loop with Pass-by-Reference?

PHP Foreach Pass by Reference Enigma: Mysterious Last Element Duplication

Dalam PHP, apabila anda menggunakan gelung foreach dengan pass-by- tugasan rujukan (cth., foreach ($arr as &$item)), tingkah laku yang tidak dijangka boleh timbul. Pertimbangkan contoh yang membingungkan ini:

$arr = ["foo", "bar", "baz"];

foreach ($arr as &$item) { /* do nothing by reference */ }
print_r($arr);

foreach ($arr as $item) { /* do nothing by value */ }
print_r($arr); // $arr has inexplicably changed
Salin selepas log masuk

Kod ini mengeluarkan:

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

Menjelaskan Penduaan

Selepas gelung foreach pertama, setiap elemen daripada $arr masih dirujuk oleh $item. Apabila gelung kedua berulang, ia menggantikan nilai setiap elemen dengan nilai $item, yang kebetulan merupakan elemen terakhir tatasusunan. Ini bermakna setiap elemen $arr ditetapkan kepada nilai $arr[2], yang membawa kepada penduaan elemen terakhir dalam output.

Menyahpepijat Output

Untuk menggambarkan tingkah laku ini, mari kita nyahpepijat output dengan menambahkan pernyataan cetakan pada setiap foreach lelaran:

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

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

Ini menghasilkan:

Item: foo
Array ( [0] => foo [1] => bar [2] => baz )

Item: bar
Array ( [0] => foo [1] => bar [2] => baz )

Item: baz
Array ( [0] => foo [1] => bar [2] => baz )

Item: foo
Array ( [0] => foo [1] => bar [2] => foo )

Item: bar
Array ( [0] => foo [1] => bar [2] => bar )

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

Anda boleh melihat dengan jelas bahawa setiap elemen $arr ditetapkan kepada nilai $item, yang berubah kepada elemen terakhir bagi tatasusunan semasa gelung foreach kedua.

Pepijat atau Bermaksud Tingkah laku?

Tingkah laku ini bukan pepijat. Ia adalah akibat daripada lulus melalui rujukan. Gelung foreach hanya memberikan nilai elemen semasa kepada pembolehubah yang dinyatakan dalam pengepala gelung. Dalam kes ini, dengan merujuk $item, kami mengubah suai elemen tatasusunan asal dalam gelung kedua. Ini bersamaan dengan kod berikut:

for ($i = 0; $i < count($arr); $i++) {
    $arr[$i] = $item;
}
Salin selepas log masuk

Oleh itu, tingkah laku yang diperhatikan bukanlah pepijat tetapi hasil daripada semantik yang dimaksudkan untuk rujukan lulus dalam PHP. Untuk mengelakkan tingkah laku sedemikian, gunakan pass-by-value dalam gelung foreach kedua dengan hanya memberikan nilai setiap elemen kepada $item: foreach ($arr sebagai $item).

Atas ialah kandungan terperinci Mengapa Elemen Terakhir Mendua dalam Gelung Foreach PHP dengan Rujukan Laluan?. 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