修改的预订树遍历 - 按分数对子项进行排序

时间:2012-04-02 07:10:42

标签: php mysql modified-preorder-tree-t

所以我能够输出我想要的数据,除了现在我希望能够根据单个项目的分数重新排列它。所以现在我输出这样的东西:

<ol>
 Item1
    <ol>
     subitem1A
        <ol>
         subsubitem1A
        </ol>
    </ol>
    <ol>
     subitem1B
    </ol>
</ol>
<ol>
 Item2
</ol>

我通过将左右值放在一个数组中并迭代它来实现。如果是左值,则会显示<ol>item,如果是正确,则会以</ol>

关闭它

使用上面的示例,我想要做的是,如果Item2得分高于Item1Item2将是第一个,Item1及其所有孩子将追随它。如果subitem1B得分高于subitem1A,则subitem1B将在subitem1A及其所有孩子之前。

我不确定在运行将所有html放在变量输出中的循环之前是否必须对数据库查询执行某些操作,但是如果我以某种方式输出输出,我就在想可以检查父<ol>的直接子项<ol>。因此,如果我查看subitem1A并查看其父级Item1,则查找父级为<ol>的任何Item1,检查分数,然后相应地进行排序。我不知道这是否可能,但这是我的思考过程。

编辑 - 按要求添加更多信息。

我执行此查询:

$sql = "SELECT * FROM table WHERE uCId = '$uCId' AND lft BETWEEN 2 AND '$max' ORDER BY lft ASC";
$result = mysql_query($sql);

然后:

$ol = array();
$html = "";
while ($row = mysql_fetch_array($result)) {          
        $ol[$row['lft']] = array('type'=>'open',
                                    'text'=>$row['text']
                                    //and more stuff like score, date, etc 
                                    );
        $ol[$row['rgt']]  = array('type'=>'close');
    }
$olCount = count($ol);
for ($d=2; $d<=$olCount; $d++) {
        if ($ol[$d]['type'] == 'open') {
            $html.= '<ol>various html'.$ol[$d]['text'].'various html';
                    }else{
                          $html .= '</ol>';
                    }

基本上我只是省略了一些会让事情变得更难阅读的HTML。分数可以放在需要的任何地方。 <ol>的ID可以是分数或任何内容。无论什么都有用。

0 个答案:

没有答案