4

に基づく:変更されたプレオーダーツリートラバーサルモデル(ネストされたセット)を<ul>に取得する

私は次の表を持っています:

id  name                            lft rgt level
1   company                         1   22  0
75  Developer                       26  31  1
76  Tester                          24  27  1
77  Analyst                         22  23  1
78  under developer                 27  30  2
79  under tster                     25  26  2

そして、ネストされたレコードをフェッチするための次のクエリ/コード:

    function getstructureInformation() {
        $treeArr = array();
        $tree = array();
        $sql = "SELECT node.name, node.id, node.unit_id,
               node.description,node.lft,node.rgt,node.level, 
               (COUNT(parent.name) - 1) AS depth
               FROM tablename AS node
               CROSS JOIN tablename AS parent
               WHERE node.lft BETWEEN parent.lft AND parent.rgt
               GROUP BY node.name
               ORDER BY node.lft";

        $query = $this->db->query($sql);
        $data = $query->result();

        foreach ($data as $datap) {
            $treeArr['id'] = $datap->id;
            $treeArr['unit_id'] = $datap->unit_id;
            $treeArr['lft'] = $datap->lft;
            $treeArr['rgt'] = $datap->rgt;
            $treeArr['level'] = $datap->level;
            $treeArr['name'] = $datap->name;
            $treeArr['depth'] = $datap->depth;
            $treeArr['description'] = $datap->description;
            $tree[] = $treeArr;
        }
        return $tree;
    }

ビューページに表示するためのPHPコードは次のとおりです。

$result = '';
 $currDepth = -1;  // -1 to get the outer <ul>
 while (!empty($tree)) {
  $currNode = array_shift($tree);
  if ($currNode['depth'] > $currDepth) {
    echo '<ul>';
  }
  if ($currNode['depth'] < $currDepth) {       
    $result .= str_repeat('</ul>', $currDepth - $currNode['depth']);
  }
  echo '<li>' . $currNode['name'] . '</li>';
  $currDepth = $currNode['depth'];
  if (empty($tree)) {
    echo str_repeat('</ul>', $currDepth + 1);
  }
}

しかし、次のように正しく表示されません。

出力を次のように表示します。

001 : Company Name

    3 : Analyst      

2 : Tester      

    33 : under tster      
        1 : Developer      
        44 : under developer

必要な出力は次のようになります。

001 : Company Name

    3 : Analyst  
    2 : Tester  
        33 : under tster  
    1 : Developer  
        44 : under developer

解決策はありますか?

4

1 に答える 1

3

これはうまくいくはずです:

function printTree ($tree) {
    $last_level = -1;

    foreach ($tree as $v) {
        $diff = $v['level'] - $last_level;
        if ($diff == 0)  {
            echo '<li>' .$v['name']. '</li>';
        }
        elseif ($diff > 0) {
            for ($i = 0; $i < $diff; $i++)
                echo '<ul>';
            echo '<li>' .$v['name']. '</li>' ;
        }
        else {
            for ($i = 0; $i > $diff; $i--)
                echo '</ul>';
            echo '<li>' .$v['name']. '</li>' ;
        }
        $last_level = $v['level'];
    }
}

しかし、この関数では深さは出力されません。

テスト済みで動作中

$tree = array (
    array (
        'name' => 'Line',
        'level' => 0
    ),
    array (
        'name' => 'Line',
        'level' => 1
    ),
    array (
        'name' => 'Line',
        'level' => 2
    ),
    array (
        'name' => 'Line',
        'level' => 1
    )
);
printTree ($tree);
于 2012-08-03T09:28:14.900 に答える