Question

Why does the following code not work as I was expecting?

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

Expected result:

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

Actual result:

Array(
    [Area1] => Array(                         
            [Section2] => Array(
                    [0] => Location2
                )                   
        )
    [Area2] => Array(           
            [Section2] => Array(              
                    [0] => Location2
                )                   
        )
)
Was it helpful?

Solution

If you modify your code on two lines as follows:

$area = array();

$section = array();

to this:

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

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

it will work as expected.

In the first version, $area and $section are acting as "pointers" to the value inside the $root array. If you reset the values first, those variables can then be used to create brand new arrays instead of overwriting the previous arrays.

OTHER TIPS

This will also works:

$root[$row[0]] = array();
$area =& $root[$row[0]];
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top