массив словарей приводится к массиву объектов в рекурсивной функции в codeigniter - PullRequest
0 голосов
/ 08 ноября 2010

Сегодня я заметил очень странное поведение в Code Igniter.У меня есть таблица locations в моей базе данных, в которой есть столбцы id, name, id_parent, level (это дерево местоположений), и я попытался сначала создать массив глубин, отсортированных по глубине,Мой подход заключался в построении рекурсивной функции в файле помощника:

$CI = & get_instance();
$CI->load->database();

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){
        $result[] = json_decode(dfs_locations($row->id,$level+1));
    }
    return json_encode($result);
}

Результат немного странный.Печать json_decode(dfs_locations($root_id,1)) дает "

Array
(
[0] => Array
(
[0] => stdClass Object
(
[id] => 1
[nivel] => 1
)

[1] => Array
(
[0] => stdClass Object
(
[id] => 2
[nivel] => 2
)

и т. Д. Без кодирования / декодирования JSON я получаю даже более странные результаты, и печатается только корень. Любая помощь очень ценится. Спасибо.

1 Ответ

0 голосов
/ 08 ноября 2010

Разобрался.До сих пор не знаю, почему происходит это безумие.Вот как я переписал функцию:

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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...