소개:
마지막 부분이 이상한 현상에 직면한 적이 있습니까? 참조에 의한 전달을 사용하여 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!