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

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

Linda Hamilton
풀어 주다: 2024-11-16 19:08:02
원래의
854명이 탐색했습니다.

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)), 예기치 않은 동작이 발생할 수 있습니다. 다음과 같은 난해한 예를 고려해 보세요.

1

2

3

4

5

6

7

$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

로그인 후 복사

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

1

2

3

4

5

6

7

8

9

10

11

12

Array

(

    [0] => foo

    [1] => bar

    [2] => baz

)

Array

(

    [0] => foo

    [1] => bar

    [2] => bar

)

로그인 후 복사

중복 설명

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

출력 디버깅

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

1

2

3

4

5

6

7

8

9

10

11

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>";

}

로그인 후 복사

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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을 참조하여 두 번째 루프에서 원래 배열 요소를 수정합니다. 이는 다음 코드와 동일합니다.

1

2

3

for ($i = 0; $i < count($arr); $i++) {

    $arr[$i] = $item;

}

로그인 후 복사

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

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

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