저는 오랫동안 PHP를 작성해왔지만 여전히 어리석은 실수를 저지릅니다. 오늘은 foreach에서 변수를 참조할 때 함정에 빠졌습니다. 코드는 다음과 같습니다.
<?php $arr = ['a', 'b', 'c', 'd', 'e']; foreach ($arr as $i=>&$a) { $a = $a.'_'. $a; echo $a .'<br>'; } echo '<hr>'; foreach ($arr as $i=>$a) { echo $a .'<br>'; } echo '<hr>'; print_r($arr);
출력 결과
처음 두 번째 foreach의 출력 결과를 봤을 때 어떻게 두 개의 d_d가 출력될 수 있을까?
잘 생각해 보니 PHP foreach에서 $a의 범위는 전체 함수의 로컬 변수이기 때문에 루프 내에 포함되지 않고 루프 외부에서도 여전히 유효한 것으로 나타났습니다.
따라서 두 번째 foreach가 실행될 때 $a는 새로운 변수가 아니지만 여전히 $arr 배열의 다섯 번째 요소에 대한 주소 참조를 가리킵니다.
두 번째 foreach가 다음과 같은 경우. 루프를 반복하면 실제로는 $arr 배열의 5번째 요소에 지속적으로 값을 할당합니다.
구체적인 할당 상황은
처음: a_a가 5번째 요소에 할당되고, 결과는 다음과 같습니다: [a_a, b_b, c_c, d_d,a_a]
두 번째: b_b가 다섯 번째 요소에 할당되고 결과는 다음과 같습니다: [a_a, b_b, c_c, d_d,b_b]
세 번째 경우: c_c가 5번째 요소에 할당되고 결과는 다음과 같습니다. [a_a, b_b, c_c, d_d,c_c]
네 번째 경우: d_d가 5번째 요소에 할당되고, 결과는 [a_a, b_b, c_c, d_d, d_d]
다섯 번째 : 이때 다섯 번째 요소가 d_d가 되었기 때문에 d_d는 다시 다섯 번째 요소에 대입되어 결과는 다음과 같습니다. still: [a_a, b_b, c_c, d_d,d_d]
해결 방법:
1. 동일한 루프 변수 이름을 사용하지 마세요.
2. $a); 사용 후 또는 다시 사용하기 전에 주소 애플리케이션을 잠금 해제하세요
또는 위의 코드 예시를 사용하세요:
$arr = ['a', 'b', 'c', 'd', 'e']; foreach ($arr as $i=>&$a) { $a = $a.'_'. $a; echo $a .'<br>'; } echo '<hr>'; echo $a; echo '<hr>'; // 这里 unset 掉 unset($a); echo $a = 'ccc'; echo '<hr>'; print_r($arr); echo '<hr>'; foreach ($arr as $i=>$a) { echo $a .'<br>'; } echo '<hr>'; print_r($arr);
출력 결과:
이제 정상입니다. 이러한 작은 세부 사항에 주의하세요
위는 PHP에서 foreach에서 참조 변수를 사용할 때의 함정에 대한 편집자의 간략한 논의입니다. PHP 중국어 웹사이트~
더 보기 PHP에서 foreach에서 참조 변수를 사용할 때의 함정에 대한 간략한 토론 관련 기사는 PHP 중국어 웹사이트에 주목하세요!