หลังจากที่วง foreach แรกยังคงมีการอ้างอิงถึงค่าบางอย่างที่ยังถูกใช้โดย$item
$arr[2]
ดังนั้นแต่ละการเรียกแต่ละครั้งในลูปที่สองซึ่งไม่ได้เรียกโดยการอ้างอิงจะแทนที่ค่านั้นและ$arr[2]
ด้วยค่าใหม่
ดังนั้นวน 1 ค่าและ$arr[2]
กลายเป็น$arr[0]
ซึ่งคือ 'foo'
วนรอบ 2 ค่าและ$arr[2]
กลายเป็น$arr[1]
ซึ่งคือ 'แถบ'
วน 3 ค่าและ$arr[2]
กลายเป็น$arr[2]
ซึ่ง 'แถบ' (เนื่องจากวนรอบ 2)
ค่า 'baz' จะหายไปเมื่อมีการโทรครั้งแรกของลูป foreach ที่สอง
การดีบักเอาต์พุต
สำหรับแต่ละการวนซ้ำของลูปเราจะแสดงค่า$item
รวมถึงพิมพ์อาร์เรย์$arr
ซ้ำ
เมื่อวงแรกวิ่งผ่านเราจะเห็นผลลัพธ์นี้:
foo
Array ( [0] => foo [1] => bar [2] => baz )
bar
Array ( [0] => foo [1] => bar [2] => baz )
baz
Array ( [0] => foo [1] => bar [2] => baz )
ในตอนท้ายของวงที่ยังคงชี้ไปที่สถานที่เดียวกันเป็น$item
$arr[2]
เมื่อวงที่สองวิ่งผ่านเราจะเห็นผลลัพธ์นี้:
foo
Array ( [0] => foo [1] => bar [2] => foo )
bar
Array ( [0] => foo [1] => bar [2] => bar )
bar
Array ( [0] => foo [1] => bar [2] => bar )
คุณจะสังเกตเห็นว่าแต่ละครั้งที่อาร์เรย์ใส่ค่าใหม่เข้าไป$item
ยังมีการอัปเดต$arr[3]
ด้วยค่าเดียวกันเนื่องจากทั้งคู่ยังคงชี้ไปที่ตำแหน่งเดียวกัน เมื่อลูปมาถึงค่าที่สามของอาร์เรย์มันจะมีค่าbar
เพราะมันเพิ่งถูกกำหนดโดยการวนซ้ำก่อนหน้าของลูปนั้น
มันเป็นข้อบกพร่องหรือไม่?
ไม่นี่คือลักษณะการทำงานของรายการอ้างอิงไม่ใช่ข้อบกพร่อง มันจะคล้ายกับการทำงานบางอย่างเช่น:
for ($i = 0; $i < count($arr); $i++) { $item = $arr[$i]; }
การวนรอบ foreach ไม่ได้พิเศษในลักษณะที่สามารถละเว้นรายการอ้างอิง มันแค่ตั้งค่าตัวแปรนั้นให้เป็นค่าใหม่ทุกครั้งที่คุณออกไปนอกวง