>  기사  >  백엔드 개발  >  foreach를 참조별 전달과 함께 사용한 후 PHP 배열의 마지막 요소가 중복된 것으로 나타나는 이유는 무엇입니까?

foreach를 참조별 전달과 함께 사용한 후 PHP 배열의 마지막 요소가 중복된 것으로 나타나는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-15 00:18:02956검색

Why does the last element of a PHP array appear duplicated after using foreach with pass-by-reference?

PHP Foreach Pass by Reference: 신비한 요소 중복

소개:

마지막 부분이 이상한 현상에 직면한 적이 있습니까? 참조에 의한 전달을 사용하여 foreach를 사용하여 반복한 후 PHP 배열의 요소가 중복된 것으로 나타납니까? 이 혼란스러운 동작은 잠재적인 버그나 이상한 시스템 동작에 대한 의문을 제기하는 경우가 많습니다.

동작 이해:

이를 이해하는 열쇠는 참조별 전달의 특성입니다. PHP의 foreach 루프에서. 매개변수에 '&'를 사용하면 배열 요소에 대한 참조가 복사되지 않고 직접 수정됩니다. 이는 루프 내에서 전달된 변수에 대한 모든 변경 사항이 원래 배열에 직접 영향을 미친다는 것을 의미합니다.

문제의 버그:

제공된 예에서:

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

foreach ($arr as &$item) {}
foreach ($arr as $item) {}

첫 번째 foreach 루프는 배열 요소에 대한 참조를 설정합니다. $item은 이제 참조이므로 루프 내에서 이를 수정하면 해당 배열 요소도 변경됩니다.

그러나 두 번째 foreach 루프는 참조를 설정하지 않습니다. 즉, 루프가 $item에 새 값을 할당하면 로컬 복사본에만 영향을 미치고 원래 배열은 업데이트하지 않습니다.

중복 효과:

이제 , $item이 마지막 배열 요소(예: 'baz')에 대한 참조인 경우를 고려해 보겠습니다. 첫 번째 루프가 이 참조를 설정하므로 두 번째 루프도 동일한 참조를 활용합니다. 결과적으로 두 번째 루프에서 $item에 할당된 모든 값은 $arr[2]로 직접 전달됩니다.

따라서 두 번째 루프에서 'bar'를 $item에 할당하면 실수로 마지막 요소가 대체됩니다. 명백한 중복으로 이어지는 'bar'가 있는 배열입니다.

예상 출력과 실제 출력:

루프 전: ["foo", "bar" , "baz"]

첫 번째 루프 이후(참조): ["foo", "bar", "foo"] ($item은 여전히 ​​$arr[2]를 참조하므로)

두 번째 루프 이후(비참조): ["foo", "bar", "bar"]

버그인가요?

아니요, 이 동작은 버그가 아닙니다. 이는 단순히 PHP의 foreach 루프에서 참조를 사용할 때 예상되는 결과입니다. 원래 배열 요소에 대한 참조인 $item 값은 수정될 때마다 기본 배열에 영향을 미칩니다.

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

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