Разобрался.До сих пор не знаю, почему происходит это безумие.Вот как я переписал функцию:
function dfs_locations($node, $level)
{ global $CI;
$result = array();
$result[] = array('id'=>$node,'level'=>$level);
$q = $CI->db->query(
'select l1.id from locations l1, locations l2'.
' where l1.id_parent=l2.id and l2.id='.$node.' order by l1.id'
);
foreach ($q->result() as $row)
{ $array = dfs_locations($row->id,$level+1);
foreach($array as $piece)
$result[] = array('id'=>$piece['id'],'level'=>$piece['nivel']);
}
return $result;
}
Обратите внимание, что я беру массив, возвращаемый рекурсивной функцией, перебираю его и добавляю его элементы в видимый в настоящее время массив (мне не нравится, как неэффективноэто, но это делает работу).При вызове более одного корня требуется еще одна вещь:
$all_locations = array();
foreach($roots as $root)
{ $auxiliary = dfs_locations($root,1);
foreach($auxiliary as $result)
$all_locations[] = $result;
}
Хотя есть только один результат, который я не могу сделать $locations[] = $auxiliary[0]
или даже $locations[] = dfs_locations($root,1)[0]
, что является позором;Вот как выглядит окончательный массив:
Array
(
[0] => Array
(
[id] => 1
[nivel] => 1
)
[1] => Array
(
[id] => 2
[nivel] => 2
)
[2] => Array
(
[id] => 7
[nivel] => 3
)
[3] => Array
(
[id] => 91
[nivel] => 4
)