php递归列表帮助

时间:2010-05-25 01:04:13

标签: php recursion

我正在尝试在PHP中显示我正在处理的网站的递归列表。

我在尝试显示第二级时遇到了麻烦。我有一个功能,显示内容到页面如下。

   function get_menu_entries($content,$which=0)
{
    global $tbl_prefix, $sys_explorer_vars, $sys_config_vars;

    // INIT LIBRARIES
    $db = new DB_Tpl();
    $curr_time = time();
    $db->query("SELECT * FROM ".$tbl_prefix."sys_explorer WHERE preid = '".$which."' && config_id = '".$sys_explorer_vars['config_id']."' && blocked = '0' && startdate < '".$curr_time."' && (enddate > '".$curr_time."' || enddate = '') ORDER BY preid,sorting");

    while($db->next_record()){
        $indent = $db->f("level") * 10 - 10;

        $sitemap_vars['break'] = "";
        $sitemap_vars['bold'] = "";

        if($db->f("level") == 2) {
            $sitemap_vars['ul_start'] = "";
            $sitemap_vars['bold'] = "class='bold'";
            $sitemap_vars['ul_end'] = "";
        }

        switch($db->f("link_type"))
        {
            case '1': // External Url
                $sitemap_vars['hyperlink'] = $db->f("link_url");
                $sitemap_vars['target'] = "";
                if($db->f("link_target") != "") {
                    $sitemap_vars['target'] = "target=\"".$db->f("link_target")."\"";
                }
            break;

            case '2': // Shortcut
                $sitemap_vars['hyperlink'] = create_url($db->f("link_eid"),$db->f("name"),$sys_config_vars['mod_rewrite']);
                $sitemap_vars['target'] = "";
            break;

            default:
                $sitemap_vars['hyperlink'] = create_url($db->f("eid"),$db->f("name"),$sys_config_vars['mod_rewrite']);
                $sitemap_vars['target'] = "";
            break;
        }

        if($db->f("level") > 1) {
            $content .= "<div style=\"text-indent: ".$indent."px;\" ".$sitemap_vars['bold']."><a href=\"".$sitemap_vars['hyperlink']."\" ".$sitemap_vars['target'].">".$db->f("name")."</a></div>\n";
        }

        $content = get_menu_entries($content,$db->f("eid"));
    }
    return(''.$content.'');
}

目前内容显示正常,但我想将此功能转换为DHTML下拉菜单。 目前,2级元素发生的事情是使用CSS使用CSS缩进内容。我需要做的是将UL标记放在开头,将/ UL标记放在2级元素的末尾。

我希望这是有道理的。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

不使用缩进的<div>标记,而是为每个级别使用无序列表,包括第一个级别。让您的函数在开始时输出<ul>,在结尾输出</ul>,并将<div style="text-indent: ...">更改为简单的<li>。为第一级提供一个ID,以便您可以挂钩。然后你可以使用CSS删除项目符号并更改缩进等。你不需要计算缩进或是否在PHP中加粗文本,而是使用选择器并允许浏览器弄明白:

ul#menu { margin: 0; padding: 0; }
    ul#menu > li { margin: 0; padding: 0; }
        ul#menu > li > ul { margin-left: 10px; font-weight: bold; }

所有这些将允许您使用一种标准算法生成列表,而不是基于级别进行分支,以及使菜单看起来像网页爬虫,搜索引擎和无CSS浏览器的菜单。

顺便说一句,你应该htmlspecialchars - 所有动态文本。你不希望流浪<弄乱你的标记。

答案 1 :(得分:0)

如果我错了,请纠正我,但似乎您的问题不在于您不知道何时打印第一组<ul>标签,而是您正在尝试打印每个函数调用中的第二个集合(对于级别2),因此最终会有太多的打开/关闭标记。

我认为你应该尝试做的是先按级别排序数组(参见uasort()然后你可以在第二级的第一个循环上输出你的开始<ul>标签(使用计数器以跟踪您所处的循环,然后执行if ($i == 0)($i == (count($array) - 1))之类的操作。无论您拥有多少嵌套级别,这都会有效。