2008-09-04 2 views
4

다음 코드가 예상 한대로 작동하지 않는 이유는 무엇입니까?PHP, 배열 및 참조

<?php 
$data = array(
    array('Area1', null, null), 
    array(null, 'Section1', null), 
    array(null, null, 'Location1'), 
    array('Area2', null, null), 
    array(null, 'Section2', null), 
    array(null, null, 'Location2') 
); 
$root = array(); 
foreach ($data as $row) { 
    if ($row[0]) { 
     $area = array(); 
     $root[$row[0]] =& $area; 
    } elseif ($row[1]) { 
     $section = array(); 
     $area[$row[1]] =& $section; 
    } elseif ($row[2]) { 
     $section[] = $row[2]; 
    } 
} 
print_r($root); 

예상 결과 :

Array(
    [Area1] => Array(       
      [Section1] => Array(
        [0] => Location1 
       )     
     ) 
    [Area2] => Array(   
      [Section2] => Array(    
        [0] => Location2 
       )     
     ) 
) 

실제 결과 :

Array(
    [Area1] => Array(       
      [Section2] => Array(
        [0] => Location2 
       )     
     ) 
    [Area2] => Array(   
      [Section2] => Array(    
        [0] => Location2 
       )     
     ) 
) 

답변

3

다음과 같이 두 줄에 코드를 수정하면이에

$area = array(); 

$section = array(); 

:

,
unset($area); 
$area = array(); 

unset($section); 
$section = array(); 

예상대로 작동합니다.

첫 번째 버전에서 $area$section$root 배열 내의 값에 "포인터"로 작용합니다. 먼저 값을 다시 설정하면 해당 변수를 사용하여 이전 배열을 덮어 쓰지 않고 새로운 배열을 만들 수 있습니다.

1

이것은 또한 작동합니다 :

$root[$row[0]] = array(); 
$area =& $root[$row[0]];