>백엔드 개발 >PHP 튜토리얼 >참조별 전달과 함께 foreach 루프를 사용할 때 PHP 배열의 마지막 요소가 중복되는 이유는 무엇입니까?

참조별 전달과 함께 foreach 루프를 사용할 때 PHP 배열의 마지막 요소가 중복되는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-14 20:19:01449검색

Why does the last element in a PHP array duplicate when using a foreach loop with pass-by-reference?

PHP Foreach Pass by Reference: 마지막 요소 중복 미스터리 공개

다음 PHP 코드를 고려하세요.

$arr = ["foo", "bar", "baz"];

foreach ($arr as &$item) { /* do nothing by reference */ }
print_r($arr);

foreach ($arr as $item) { /* do nothing by value */ }
print_r($arr);

실행 시 원래 배열 $arr가 예기치 않게 수정되어 다음과 같은 결과가 출력됩니다.

Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)
Array
(
    [0] => foo
    [1] => bar
    [2] => bar
)

동작 이해

초기 foreach 루프 후에 변수는 $item은 $arr[2]와 동일한 메모리 위치에 대한 참조로 유지됩니다. 결과적으로 인수를 값으로 전달하는 두 번째 foreach 루프의 각 반복은 참조된 값(따라서 $arr[2])을 새 반복의 값으로 대체합니다.

자세한 설명

첫 번째 루프에서:

  • $item은 'foo'인 $arr[0]의 값을 참조합니다.
  • $item 및 $arr[0 ] 둘 다 'foo'를 가리킵니다.
  • 이 프로세스는 $arr[1] 및 $arr[2]에 대해 반복됩니다.

첫 번째 루프가 끝나면 $item은 여전히 $arr[2]를 가리킵니다.

두 번째 루프에서:

  • $item에는 'foo'인 $arr[0] 값이 할당됩니다.
  • $arr[2](여전히 $item에서 참조됨)도 'foo'로 설정됩니다.
  • 이는 $arr[2]에서 'baz'의 원래 값을 덮어씁니다.
  • $arr[1]에 대해서도 동일한 프로세스가 발생하고 마지막으로 $arr[2]에는 이전 반복으로 인해 이제 'bar'인 $arr[2] 값이 할당됩니다.

오해 해명

이 동작은 버그로 간주되지 않습니다. 이는 PHP에서 의도한 참조 동작과 일치합니다. 루프 외부에서 다음 구문을 사용한 경우 유사한 결과가 관찰됩니다.

for ($i = 0; $i < count($arr); $i++) { $item = $arr[$i]; }

결론

PHP에서 참조로 작업할 때 다음을 인식하는 것이 중요합니다. 참조된 변수를 통해 수정한 내용도 원래 값에 영향을 미칩니다. 이 동작은 원하는 결과에 따라 효과적으로 활용되거나 방지될 수 있습니다.

위 내용은 참조별 전달과 함께 foreach 루프를 사용할 때 PHP 배열의 마지막 요소가 중복되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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