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

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

Barbara Streisand
Barbara Streisand원래의
2024-11-13 10:54:02607검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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