foreach 사용시 주의점
php 에서 주의해야 할 code
의 이야기를 조금 정리 해 보자.
문제의 code
아래 코드를 실행해 보자.
- https://www.w3schools.com/php/phptryit.asp?filename=tryphp_compiler
$a = array ('zero','one','two', 'three');
foreach ($a as &$v) {
}
foreach ($a as $v) {
echo $v.'-'.$a[3].PHP_EOL;
}
상식적으로 우리는 다음과 같은 결론을 기대한다.
zero-three
one-three
two-three
three-three
하지만 php 에서 저 code 를 돌리면 아래와 같은 결과가 나온다.
zero-zero
one-one
two-two
two-two
원인
이유는 2번째 foreach
에서도 $v
는 여전히 살아있다. 그래서 1번째 foreach
에서 &$v
는 $a[2]
를 할당받은 상태인데, 이 변수가 그대로 살아서 2번째 foreach
에서 동작한다. 그래서 2번째 foreach
는 결국 아래와 같은 모습이 되는 것이다.
foreach ($a as a[3]){
...
}
우리는 $v
가 새롭게 생성된 변수라고 생각했지만, 우리는 계속 이전의 변수 $v
(이 값이 a[3]
을 가리키고 있다.) 에 값을 넣고 있는 것이다.
해결
PHP Pass by reference in foreach - Stack Overflow 의 댓글을 보면 PHP: foreach - Manual 에서 이야기 하는 바로는 unset($v)
를 해주라고 한다.
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
unset($value); // break the reference with the last element
?>
댓글 없음:
댓글 쓰기