첫 번째 foreach 루프 $item
이후에도에서 사용되는 일부 값에 대한 참조 $arr[2]
입니다. 따라서 참조로 호출하지 않는 두 번째 루프의 각 foreach 호출은 해당 값을 $arr[2]
새 값으로 대체합니다 .
따라서 루프 1, 값 및 $arr[2]
이 될 $arr[0]
'갑'이다.
루프 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 루프는 참조 된 항목을 무시할 수있는 특성상 특별하지 않습니다. 루프 외부 에서처럼 매번 해당 변수를 새 값으로 설정하는 것입니다.