> 백엔드 개발 > PHP 튜토리얼 > 참조에 의한 전달을 사용하는 PHP foreach 루프가 배열을 예기치 않게 변경하는 이유는 무엇입니까?

참조에 의한 전달을 사용하는 PHP foreach 루프가 배열을 예기치 않게 변경하는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-11-13 10:54:02
원래의
572명이 탐색했습니다.

Why does my PHP foreach loop with pass-by-reference change my array unexpectedly?

참조에 의한 PHP Foreach 전달: 마지막 요소가 중복됩니까? (버그?)

문제 이해

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

$arr = array("foo", "bar", "baz");

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

foreach ($arr as $item) {}
print_r($arr); // $arr has changed to ["foo", "bar", "bar"]
로그인 후 복사

첫 번째 루프 후에 배열은 예상대로 인쇄됩니다:

Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)
로그인 후 복사

그러나 두 번째 루프 이후에는 배열이 예기치 않게 변경됨:

Array
(
    [0] => foo
    [1] => bar
    [2] => bar
)
로그인 후 복사

설명

첫 번째 foreach 루프가 $item을 참조로 전달하기 때문에 문제가 발생합니다. 이는 $item이 $arr 배열의 요소에 대한 별칭임을 의미합니다. 첫 번째 루프에서는 $item 또는 $arr에 변경 사항이 적용되지 않습니다.

그러나 두 번째 루프에서는 $item을 값으로 전달합니다. 루프에서 $item 값에 새 값이 할당되면 $arr의 해당 요소도 수정됩니다.

구체적으로 $arr의 세 번째 요소("baz")는 다음 값으로 덮어쓰여집니다. 두 번째 루프의 마지막 반복 동안 두 번째 요소("bar"). 이는 두 번째 루프 이후 $arr의 마지막 요소가 중복되는 이유를 설명합니다.

버그인가요?

아니요, 이 동작은 버그가 아닙니다. 이는 참조로 변수를 전달할 때 foreach 루프의 의도된 동작입니다. 배열의 예기치 않은 변경을 방지하려면 이 동작을 인식하는 것이 중요합니다.

출력 디버깅

동작 시각화를 돕기 위해 다음 코드는 에코 문을 추가합니다. 루프를 반복할 때마다 $item 값과 $arr 배열을 인쇄하려면:

echo "<br>";

foreach ($arr as &$item) {
    echo "Item: $item; Arr: ";
    print_r($arr);
    echo "<br>";
}

echo "<br>";

foreach ($arr as $item) {
    echo "Item: $item; Arr: ";
    print_r($arr);
    echo "<br>";
}
로그인 후 복사

출력에서는 다음을 보여줍니다. $item 및 $arr는 루프 중에 변경되며 위에서 설명한 동작을 명확하게 보여줍니다.

위 내용은 참조에 의한 전달을 사용하는 PHP foreach 루프가 배열을 예기치 않게 변경하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿