> 백엔드 개발 > PHP 튜토리얼 > 참조가 포함된 PHP의 Foreach 루프가 마지막 배열 요소를 덮어쓰는 이유는 무엇입니까?

참조가 포함된 PHP의 Foreach 루프가 마지막 배열 요소를 덮어쓰는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-27 14:37:14
원래의
325명이 탐색했습니다.

Why Does PHP's Foreach Loop with References Overwrite the Last Array Element?

참조를 사용하는 Foreach 루프의 예기치 않은 동작

참조와 함께 PHP의 foreach 루프를 사용하는 경우 다음 코드 조각에서 볼 수 있듯이 이상한 동작이 발생할 수 있습니다. :

$a = array('a', 'b', 'c', 'd');

foreach ($a as &$v) { }
foreach ($a as $v) { }

print_r($a);
로그인 후 복사

이 코드는 배열을 반복하기 위한 것입니다. $a는 첫 번째 루프에서 참조 변수 $v를 사용하고 두 번째 루프에서는 비참조 변수 $v를 사용합니다. 그러나 놀랍게도 출력에서는 배열의 마지막 요소인 'd'가 덮어쓰기되었음을 보여줍니다.

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => c
)
로그인 후 복사

동작 설명

이것은 예상치 못한 일입니다. 동작은 PHP 문서에 잘 문서화되어 있습니다. foreach 루프에서 참조를 사용할 때 루프가 종료된 후에도 배열의 마지막 요소에 대한 참조가 유지된다는 경고가 표시됩니다. 이 문제를 방지하려면 unset()을 사용하여 참조 변수를 설정 해제하는 것이 좋습니다.

이 예에서 참조 변수 $v는 첫 번째 루프 이후 $a의 마지막 요소에 대한 참조로 유지됩니다. 두 번째 루프가 $a를 반복하면 루프가 반복될 때마다 값이 $v에 다시 할당됩니다. 그러나 $v는 $a의 마지막 요소에 대한 참조이므로 해당 요소의 값을 덮어씁니다.

동작에 대한 단계별 안내

더 명확하게 설명하기 위해 다음은 코드 조각에서 어떤 일이 발생하는지에 대한 단계별 가이드입니다.

  1. 첫 번째 foreach 루프는 각 배열 요소의 참조를 $v에 할당합니다.
  2. 두 번째 foreach 루프에서 $v는 여전히 $a의 마지막 요소인 'd'를 참조합니다.
  3. 루프가 반복됩니다. $a를 통해 각 값을 $v에 다시 할당합니다.
  4. $v는 $a의 마지막 요소에 대한 참조이므로 해당 요소의 값을 다음으로 덮어씁니다.
  5. $a의 마지막 요소는 이전 요소의 값으로 덮어쓰게 됩니다.

해결책

To 이 문제를 방지하려면 첫 번째 루프 후에 참조 변수 $v를 설정 해제하세요.

foreach ($a as &$v) { }
unset($v);
foreach ($a as $v) { }
로그인 후 복사

위 내용은 참조가 포함된 PHP의 Foreach 루프가 마지막 배열 요소를 덮어쓰는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿