2012-06-12 1 views
1

값을 함수로 전달할 때 배열이 수정되는 문제가 발생했습니다.값에 의한 PHP 배열 인수가 참조로 배열 항목을 반복 할 때 수정 됨

코드를 검사하고 함수 내부에서 참조로 요소를 가져 오는 배열이 반복됩니다.

루프 후 배열 항목이 참조 된 것으로 표시된다는 사실에 놀랐습니다. 나는 이것이 무엇을 의미하는지 모르지만 내 문제의 근원이되어야합니다.

요점을보기 위해 예를 들어 보겠습니다.

<?php 
error_reporting(E_ALL); 
ini_set('display_errors' , 1); 

$a = array(array(0)); 
echo '--1--';var_dump($a); 
dummy($a); 
echo '--4--';var_dump($a); 

function dummy($arg) { 
    foreach($arg as &$item) { 
     $item[0] = 3; 
    }  
    dummy2($arg); 
echo '--3--';var_dump($arg); 
} 

function dummy2($arg) { 
    foreach($arg as &$item) { 
     $item[1]=9; 
    } 
echo '--2--';var_dump($arg); 
} 
?> 
I 포인트 3, $의 인수는 하나의 요소가 것이라고 기대하는이 코드 후

하지만이있다, 그래서이 dummy2 기능에 의해 수정되었습니다.

--1--array(1) { [0]=> array(1) { [0]=> int(0) } } 
--2--array(1) { [0]=> &array(2) { [0]=> int(3) [1]=> int(9) } } 
--3--array(1) { [0]=> &array(2) { [0]=> int(3) [1]=> int(9) } } 
--4--array(1) { [0]=> array(1) { [0]=> int(0) } } 

왜 어레이 참조로 반복 된 후 & 배열로 표시된 다음과 같이

출력은? 어떻게 피할 수 있습니까?

답변

2

의 배열을 반환 :

<?php 
error_reporting(E_ALL); 
ini_set('display_errors' , 1); 

$a = array(array(0)); 
echo '--1--';var_dump($a); 
dummy($a); 
echo '--4--';var_dump($a); 

function dummy($arg) { 
    foreach($arg as &$item) { 
     $item[0] = 3; 
    } 
    unset($item); 
    dummy2($arg); 
echo '--3--';var_dump($arg); 
} 

function dummy2($arg) { 
    foreach($arg as &$item) { 
     $item[1]=9; 
    } 
    unset($item); 
echo '--2--';var_dump($arg); 
} 
?> 

documentation for foreach에서보기를, 다음과 같이 큰 빨간색 경고가 표시됩니다.

$ value 및 마지막 배열 요소에 대한 참조는 foreach 루프 후에도 유지됩니다. unset()에 의해 파기하는 것이 좋습니다.

0

사용 key => value쌍과 기능

<?php 

    error_reporting(E_ALL); 
    ini_set('display_errors' , 1); 

    $a = array(array(0)); 

    echo '--1--';var_dump($a); 

    $a = dummy($a); 

    echo '--4--';var_dump($a); 

    function dummy($arg) { 

     foreach($arg as $key => $value) { 

      $arg[$key][0] = 3; 
     } 

     return dummy2($arg); 
    } 

    function dummy2($arg) { 

     foreach($arg as $key => $value) { 

      $arg[$key][1]=9; 
     } 

     return $arg; 
    } 
?> 

당신은 참조에 의해 캡처 루프 변수 설정 해제 할 필요가 http://codepad.org/f30c6FUj