2012-05-05 4 views
1

이 가능한 중복 :
Strange behavior Of foreach
Strange behaviour after loop by reference - Is this a PHP bug?포인터

이 이

이 사람이 나를 설명 할 수있는 이유 코드 :

<pre> 
<?php 

$a = array('page', 'email', 'comment'); 
$b = array('page' => 'realpage', 'email' => 'reaLmail', 'comment' => 'c'); 
$c = array(); 

foreach ($a as &$item) { 
     if (isset($b[$item])) { 
       $item = $b[$item]; 
     } 
} 


foreach ($a as $item) { 
     $c[] = $item; 
} 

print_r($c); 

출력

Array 
(
    [0] => realpage 
    [1] => reaLmail 
    [2] => reaLmail 
) 

??? 왜 2 루프 (A)는 (위해서 var_dump 의해) 전에

array(3) { 
    [0]=> 
    string(8) "realpage" 
    [1]=> 
    string(8) "reaLmail" 
    [2]=> 
    &string(1) "c" 
} 

그러나 첫 번째 반복에서, A는

array(3) { 
    [0]=> 
    string(8) "realpage" 
    [1]=> 
    string(8) "reaLmail" 
    [2]=> 
    &string(8) "realpage" 
} 

과 두 번째 및 세 번째 [1], [2] 인덱스가 동일한 "reaLmail에

", [2]는 포인터입니까? 감사합니다.

+0

이 BTW, (적어도 유저 랜드에서) PHP에는 포인터가없는'&'의 기준입니다 연산자 (C++과 비슷하지만 같은 것은 아닙니다). –

+0

만약 첫 번째'foreach' 후에'var_dump ($ a);'를 쓰면 array의 마지막 항목이 실제로 poiner라는 것을 볼 수 있습니다. 그러므로 마지막'$ c [] = $ item;'은 작동하지 않고'$ item'은 이전 반복에서 동일하게 유지됩니다. –

답변

1

, 다음 unset는 PHP 매뉴얼에 설명으로 필요합니다

foreach ($a as &$item) { 
     if (isset($b[$item])) { 
       $item = $b[$item]; 
     } 
} 
unset($item); 
0

첫 번째 루프에는 &이 필요하지 않으므로 참조하십시오. 그것을 제거하고 예제가 잘 작동합니다. 당신이 foreach (... as &..)를 사용하는 경우

foreach ($a as &$item)