PHP Foreach 참조에 의한 전달 및 배열 수정
PHP의 foreach 루프에서 참조에 의한 전달을 사용하면 예기치 않은 동작이 발생할 수 있습니다. 다음 코드를 고려하십시오.
$arr = ["foo", "bar", "baz"]; foreach ($arr as &$item) {} // Array remains unchanged: ["foo", "bar", "baz"] foreach ($arr as $item) {} // Array is modified: ["foo", "bar", "bar"]
두 번째 루프가 배열을 수정하는 이유는 무엇입니까?
첫 번째 루프에서는 $item 변수가 참조로 전달됩니다. 이는 $item에 대한 변경 사항이 $arr 배열의 해당 요소에도 영향을 미친다는 것을 의미합니다. 그러나 두 번째 루프에서는 $item이 값으로 전달됩니다. 따라서 $item에 대한 변경 사항은 배열에 영향을 주지 않습니다.
결정적으로 첫 번째 루프 후에도 $item은 여전히 $arr의 마지막 요소를 참조합니다. 두 번째 루프가 배열을 반복할 때 $item의 각 값은 $arr의 마지막 요소를 덮어씁니다. 둘 다 동일한 메모리 위치를 참조하기 때문입니다.
출력 디버깅
동작을 이해하기 위해 $item의 현재 값을 에코하고 각 루프 반복 중에 $arr 배열을 재귀적으로 인쇄할 수 있습니다.
첫 번째 루프:
foo Array ( [0] => foo [1] => bar [2] => baz ) bar Array ( [0] => foo [1] => bar [2] => baz ) baz Array ( [0] => foo [1] => bar [2] => baz )
첫 번째 루프 이후 $item은 $arr의 마지막 요소를 가리킵니다.
두 번째 루프:
foo Array ( [0] => foo [1] => bar [2] => foo ) bar Array ( [0] => foo [1] => bar [2] => bar ) bar Array ( [0] => foo [1] => bar [2] => bar )
$item의 각 값을 덮어쓰게 됩니다. , $arr의 마지막 요소도 수정합니다.
버그인가요?
아니요, 이 동작은 버그가 아니라 pass-의 의도된 동작입니다. 참조로. 참조로 변수를 전달하는 것의 의미를 이해하고 적절하게 사용하는 것이 중요합니다.
위 내용은 PHP `foreach` 루프에서 참조별 전달을 사용하면 루프가 끝난 후 배열이 수정되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!