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

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

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-27 14:37:14333검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.