>  기사  >  백엔드 개발  >  참조별 전달을 사용하는 PHP의 Foreach 루프에서 마지막 요소가 중복되는 이유는 무엇입니까?

참조별 전달을 사용하는 PHP의 Foreach 루프에서 마지막 요소가 중복되는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-16 19:08:02775검색

Why Does the Last Element Duplicate in PHP's Foreach Loop with Pass-by-Reference?

PHP Foreach Pass by Reference Enigma: 신비한 마지막 요소 중복

PHP에서 foreach 루프를 pass-by- 참조 할당(예: foreach($arr as &$item)), 예기치 않은 동작이 발생할 수 있습니다. 다음과 같은 난해한 예를 고려해 보세요.

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

foreach ($arr as &$item) { /* do nothing by reference */ }
print_r($arr);

foreach ($arr as $item) { /* do nothing by value */ }
print_r($arr); // $arr has inexplicably changed

이 코드는 다음을 출력합니다.

Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)
Array
(
    [0] => foo
    [1] => bar
    [2] => bar
)

중복 설명

첫 번째 foreach 루프 이후에 각 요소는 $arr는 여전히 $item에서 참조됩니다. 두 번째 루프가 반복되면 각 요소의 값이 배열의 마지막 요소인 $item의 값으로 대체됩니다. 이는 $arr의 각 요소가 $arr[2]의 값으로 설정되어 출력의 마지막 요소가 중복된다는 의미입니다.

출력 디버깅

이 동작을 설명하기 위해 각 foreach 반복에 print 문을 추가하여 출력을 디버깅해 보겠습니다.

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

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

이 결과는 다음과 같습니다.

Item: foo
Array ( [0] => foo [1] => bar [2] => baz )

Item: bar
Array ( [0] => foo [1] => bar [2] => baz )

Item: baz
Array ( [0] => foo [1] => bar [2] => baz )

Item: foo
Array ( [0] => foo [1] => bar [2] => foo )

Item: bar
Array ( [0] => foo [1] => bar [2] => bar )

Item: bar
Array ( [0] => foo [1] => bar [2] => bar )

$arr는 두 번째 foreach 루프 중에 배열의 마지막 요소로 변경되는 $item 값으로 설정됩니다.

버그 또는 의도된 동작?

이것은 행동은 버그가 아닙니다. 참조로 전달한 결과입니다. foreach 루프는 단순히 현재 요소의 값을 루프 헤더에 지정된 변수에 할당합니다. 이 경우 $item을 참조하여 두 번째 루프에서 원래 배열 요소를 수정합니다. 이는 다음 코드와 동일합니다.

for ($i = 0; $i < count($arr); $i++) {
    $arr[$i] = $item;
}

따라서 관찰된 동작은 버그가 아니라 PHP에서 의도한 참조별 전달 의미의 결과입니다. 이러한 동작을 방지하려면 단순히 각 요소의 값을 $item에 할당하여 두 번째 foreach 루프에서 값별 전달을 사용하세요. foreach($arr는 $item으로).

위 내용은 참조별 전달을 사용하는 PHP의 Foreach 루프에서 마지막 요소가 중복되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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