2014-09-27 2 views
0

다음 PHP 코드 세그먼트를 고려하십시오. 여기

$array1 = array(1,20); 
$x = &$array1[1]; 
$array2 = $array1; 
$array2[1] = 22; 
print_r($array1[1]); // Output is 22 

, $array2$array1에 참조하는 것이 아니라, 어떻게 $array1의 값을 변경하여 $array2에서 값을 변경?

+0

이 게시물에 기반한이 게시물에 관심이 있으십니까?이 동작을보고있는 이유에 대해 자세히 설명합니다. http://stackoverflow.com/questions/26081106/assign-by-reference-bug – mschuett

답변

0

$array2$array1의 참조로 사용하려면 $x과 동일한 작업을 수행하십시오. $array2$array1 단지 참조이기 때문에 당신이 $array1 또는 $array2 중 하나에서 변경 이제 아무것도

$array2 = &$array1; 

은 두 배열에 표시됩니다.


업데이트

당신이보고 될 수 있습니다 것은 값을 변경하는 방법입니다 만, 여전히 배열의 전체 복사본을 가지고, 그것에 대해 생각. 이것은 객체로 수행 할 수 있습니다.

$obj = new stdClass(); 
$array1 = array(1, 20); 
$array1[1] = $obj; 
$array1[1]->color = 22; 

$array2 = $array1; 
$array2[1]->color = 33; 

echo $array1[1]->color; // prints 33 

개체는 항상 참조로 복사되는 반면 숫자와 문자열은 그대로 복사됩니다.

+0

나는 그가 조금 더 깊이 알고 있다는 것을 모르지만 그의 질문을 생각합니다. array2는 배열 1에 대한 참조가 아닐지라도 array2가 변경 될 때 array1이 가리키는 포인터가됩니다. – mschuett

+0

예, 내부적으로 언어는 쓸모없는 사본을 많이 피하기 위해 쓰기 방법론에 사본을 사용할 수 있습니다. –

+0

이 경우 나는 그것이 매우 위험하다고 말할 것이다. 나는 개인적으로 array2의 두 번째 인덱스가 array1에 대한 포인터가 될 것이라고 기대하지 않을 것이다. – mschuett

관련 문제