참조에 의한 PHP Foreach 전달: 마지막 요소가 중복됩니까? (버그?)
문제 이해
다음 PHP 코드를 고려하세요.
$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"]
첫 번째 루프 후에 배열은 예상대로 인쇄됩니다:
Array ( [0] => foo [1] => bar [2] => baz )
그러나 두 번째 루프 이후에는 배열이 예기치 않게 변경됨:
Array ( [0] => foo [1] => bar [2] => bar )
설명
첫 번째 foreach 루프가 $item을 참조로 전달하기 때문에 문제가 발생합니다. 이는 $item이 $arr 배열의 요소에 대한 별칭임을 의미합니다. 첫 번째 루프에서는 $item 또는 $arr에 변경 사항이 적용되지 않습니다.
그러나 두 번째 루프에서는 $item을 값으로 전달합니다. 루프에서 $item 값에 새 값이 할당되면 $arr의 해당 요소도 수정됩니다.
구체적으로 $arr의 세 번째 요소("baz")는 다음 값으로 덮어쓰여집니다. 두 번째 루프의 마지막 반복 동안 두 번째 요소("bar"). 이는 두 번째 루프 이후 $arr의 마지막 요소가 중복되는 이유를 설명합니다.
버그인가요?
아니요, 이 동작은 버그가 아닙니다. 이는 참조로 변수를 전달할 때 foreach 루프의 의도된 동작입니다. 배열의 예기치 않은 변경을 방지하려면 이 동작을 인식하는 것이 중요합니다.
출력 디버깅
동작 시각화를 돕기 위해 다음 코드는 에코 문을 추가합니다. 루프를 반복할 때마다 $item 값과 $arr 배열을 인쇄하려면:
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>"; }
출력에서는 다음을 보여줍니다. $item 및 $arr는 루프 중에 변경되며 위에서 설명한 동작을 명확하게 보여줍니다.
위 내용은 참조에 의한 전달을 사용하는 PHP foreach 루프가 배열을 예기치 않게 변경하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!