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 ) ) )
If you modify your code on two lines as follows:
to this:
it will work as expected.
In the first version,
$areaand$sectionare acting as ‘pointers’ to the value inside the$rootarray. If you reset the values first, those variables can then be used to create brand new arrays instead of overwriting the previous arrays.