Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah elemen terakhir dalam tatasusunan PHP menjadi pendua apabila menggunakan gelung foreach dengan rujukan lulus?

Mengapakah elemen terakhir dalam tatasusunan PHP menjadi pendua apabila menggunakan gelung foreach dengan rujukan lulus?

Susan Sarandon
Susan Sarandonasal
2024-11-14 20:19:01367semak imbas

Why does the last element in a PHP array duplicate when using a foreach loop with pass-by-reference?

PHP Foreach Pass melalui Rujukan: Misteri Penduaan Elemen Terakhir Terbongkar

Pertimbangkan kod PHP berikut:

$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);

Selepas pelaksanaan, ia secara tidak dijangka mengubah suai tatasusunan asal $arr, mengakibatkan output berikut:

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

Memahami Tingkah Laku

Selepas gelung foreach awal, pembolehubah $item kekal sebagai rujukan kepada lokasi memori yang sama seperti $arr[2 ]. Akibatnya, setiap lelaran gelung foreach kedua, yang menghantar argumen mengikut nilai, menggantikan nilai yang dirujuk (dan oleh itu $arr[2]) dengan nilai lelaran baharu.

Penjelasan Terperinci

Dalam gelung pertama:

  • rujukan $item nilai pada $arr[0], iaitu 'foo'.
  • $item dan $arr[0] kedua-duanya menunjuk ke 'foo'.
  • Proses ini berulang untuk $arr[1 ] dan $arr[2].

Pada penghujung gelung pertama, $item masih menunjuk ke $arr[2].

Dalam gelung kedua:

  • $item diberikan nilai $arr[0], iaitu 'foo'.
  • $arr[2] (masih dirujuk oleh $item) juga ditetapkan kepada 'foo'.
  • Ini menimpa nilai asal bagi 'baz' di $arr[2].
  • Proses yang sama berlaku untuk $arr[1], dan akhirnya, $arr[2] diberikan nilai $arr[2], yang kini ' bar' disebabkan oleh lelaran sebelumnya.

Menjelaskan Salah Tanggapan

Tingkah laku ini adalah tidak dianggap pepijat. Ia sejajar dengan gelagat rujukan yang dimaksudkan dalam PHP. Keputusan yang sama akan diperhatikan jika anda menggunakan sintaks berikut di luar gelung:

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

Kesimpulan

Apabila bekerja dengan rujukan dalam PHP, adalah penting untuk mengenali bahawa pengubahsuaian yang dibuat melalui pembolehubah yang dirujuk juga akan mempengaruhi nilai asal. Tingkah laku ini boleh dimanfaatkan dengan berkesan atau dielakkan bergantung pada hasil yang diingini.

Atas ialah kandungan terperinci Mengapakah elemen terakhir dalam tatasusunan PHP menjadi pendua apabila menggunakan gelung foreach dengan rujukan lulus?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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