0


0

辞書の配列は、codeigniterの再帰関数のオブジェクトの配列にキャストされます

今日、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 Answer


0


整理した。 なぜこの狂気が起こるのかわからない。 関数を書き直した方法は次のとおりです。

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;
}

再帰関数によって返された配列を取得し、それを反復処理し、その要素を現在表示されている配列に追加していることに注意してください(効率が悪いのは好きではありませんが、仕事は完了します)。 複数のルートを呼び出す場合、もう1つ必要です。

$all_locations = array();
foreach($roots as $root)
{   $auxiliary = dfs_locations($root,1);
    foreach($auxiliary as $result)
        $all_locations[] = $result;
}

結果は1つしかありませんが、「$ 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
)