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