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"]
Selepas gelung pertama, tatasusunan dicetak seperti yang dijangkakan:
Array ( [0] => foo [1] => bar [2] => baz )
Walau bagaimanapun, selepas gelung kedua, tatasusunan berubah tanpa diduga:
Array ( [0] => foo [1] => bar [2] => bar )
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>"; }
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!