2008-09-04 18 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

次のように2行にコードを変更した場合:これに

$area = array(); 

$section = array(); 

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

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

期待どおりに動作します。

最初のバージョンでは、$area$sectionは、$rootアレイ内の値の「ポインタ」として機能しています。最初に値をリセットすると、それらの変数を使用して、以前の配列を上書きするのではなく、新しい配列を作成することができます。

1

また、これは動作しますします:

$root[$row[0]] = array(); 
$area =& $root[$row[0]]; 
関連する問題