2008-09-04 9 views
4

Pourquoi le code suivant ne fonctionne pas comme je m'y attendais?PHP, tableaux et références

<?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); 

Résultat attendu:

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

Résultat réel:

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

Répondre

3

Si vous modifiez votre code sur deux lignes comme suit:

$area = array(); 

$section = array(); 

à ceci:

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

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

cela fonctionnera comme prévu.

Dans la première version, $area et $section agissent comme des "pointeurs" sur la valeur à l'intérieur du tableau $root. Si vous réinitialisez d'abord les valeurs, ces variables peuvent ensuite être utilisées pour créer de nouvelles baies au lieu d'écraser les baies précédentes.

1

Cela fonctionne aussi:

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