2008-09-04 92 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]];