5 votes

PHP, tableaux et références

Pourquoi le code suivant ne fonctionne-t-il pas comme je l'espérais ?

<?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 escompté :

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

3voto

pix0r Points 17854

Si vous modifiez votre code sur deux lignes comme suit :

$area = array();

$section = array();

à ça :

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

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

il fonctionnera comme prévu.

Dans la première version, $area y $section agissent comme des "pointeurs" vers la valeur à l'intérieur de l'objet $root le tableau. Si vous réinitialisez d'abord les valeurs, ces variables peuvent ensuite être utilisées pour créer de tout nouveaux tableaux au lieu d'écraser les tableaux précédents.

1voto

grom Points 8057

Cela fonctionne également :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X