4

次のMySQLテーブルを使用して、ツリーを表すYiiのモデルがあります。

CREATE TABLE IF NOT EXISTS `nodes` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `node` varchar(255) NOT NULL,
    [ something more not necessary to display here ]
    `parentid` int(11) NOT NULL DEFAULT '0',
    PRIMARY KEY (`id`),
) ENGINE=InnoDB;

このモデルには次の関係があります。

return array(
    'parentnode'=>array(self::BELONGS_TO, 'Nodes', 'parentid'),
    'childnode'=>array(self::HAS_MANY, 'Nodes', 'parentid'),
);

CTreeView を使用してツリーを表示しています。$model->childnode を使用して、parentid=0 のすべてのノードを再帰的に反復してソース配列を構築します。これは反復関数です。

public static function nodetree($params) { //finds all top-level nodes
    $retval=array();
    $nodes=Nodes::model()->findAllByAttributes(array('parentid'=>0));
    foreach($nodes as $anode)
        $retval[]=Nodes::nodearray($anode, $params);
}

これが再帰関数です。

public static function nodearray($_node, $params) { // finds children
    $retval=array(
        'text'=>$_node->node, //may differ based on options
        'id'=>$_node->id,
        'expanded'=>false,    //may differ based on options
        'children'=>array(),
    );
    foreach ($_node->childnode as $c_node)
        $retval['children'][]=Nodes::nodearray($c_node, $params);
    return $retval;
}

おそらく、これは Yii のオーバーヘッドのため、最速のアプローチではありません。他のアプリケーションが実行されていない開発サーバーでは、ページの生成に 1 秒以上かかります。ノードは 1K を超えており、必要に応じてユーザーによって更新されています。

ツリー/ページをより速く生成するにはどうすればよいですか?

4

2 に答える 2

2

これは、これまでにテストした中で最も効率的な方法です。http://blog.ideashower.com/post/15147134343/create-a-parent-child-array-structure-in-one-passから派生

public static function nodetree($param=array()) {
    $refs = array();
    $list = array();

    $nodes = Yii::app()->db->createCommand('select * from nodes')->queryAll();

    foreach ($nodes as $data) {
        $thisref = &$refs[ $data['id'] ];
        $thisref['parentid'] = $data['parentid'];
        $thisref['text'] = $data['node'];
        if ($data['parentid'] == 0) {
            $list[ $data['id'] ] = &$thisref;
        } else {
            $refs[ $data['parentid'] ]['children'][ $data['id'] ] = &$thisref;
        }   
    }           
    return $list;
}
于 2013-09-15T23:36:37.377 に答える