[컴][php] php 에서 주의해야 할 code

 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
?>

댓글 없음:

댓글 쓰기