递归meny阅读与非重复

时间:2016-02-10 07:36:03

标签: php mysql recursion

我正在尝试创建一个从db中读取多个(page_id,page_title)的函数,这是我递归的。函数应该为所有现有页面制作缩进的嵌套UL-s,就像树一样,并且正在这样做。当我尝试消除递归循环中的重复时问题就开始了。出于某种原因,in_array不能正常工作,或者我错过了一些东西。我在PHP5.5.1.2上工作。 谁知道这里的问题是什么? 我的代码现在是:

function nav($page_set,$pages,$count){
    echo "<ul>";
    while ($page = mysqli_fetch_array($page_set)) {
        if(!in_array($page['page_id'],$pages)){
                echo "<li><a href=\"content.php?page=" . urlencode($page['page_id']) . "\">{$page["page_title"]}</a></li>";
                if (!is_null(get_pages($page['page_id'])))
                {
                $pages[$count]=$page['page_id'];
                $count++;
                nav(get_pages($page['page_id']),$pages,$count); 
                }   
        }
    }
    echo "</ul>";
} 

function get_pages($page_id){
    global $connection;
    $query = "SELECT page.page_id, page.page_parent, page.page_meny_position, page_lang_content.page_title FROM page JOIN page_lang_content ON page.page_id=page_lang_content.page_id ";
    if (isset($page_id))
    {
    $query .= " WHERE page.page_parent = ".$page_id;
    }
    $query .= " ORDER BY `page`.`page_id` ASC ";
    $page_set = mysqli_query($connection,$query);
    confirm_query($page_set);
    return $page_set;
}

AND函数调用:

<?php echo nav(get_pages(NULL),$pages=array(),$count=0)?>

1 个答案:

答案 0 :(得分:0)

我没有对此进行测试,但我认为你仍然会得到重复项,因为你实际上并没有将所有page_id存储在$ pages变量中,这样所有处理过的page_id都可以在所有的递归轮次中使用。您需要在递归中返回$ pages数组以确保它包含所有已处理的值(我还删除了计数值,因为它似乎没有任何意义):

function nav($page_set,$pages)
{
    echo "<ul>";
    while ($page = mysqli_fetch_array($page_set)) 
    {
        if(!in_array($page['page_id'],$pages))
        {
            echo "<li><a href=\"content.php?page=" . urlencode($page['page_id']) . "\">{$page["page_title"]}</a></li>";
            if (!is_null(get_pages($page['page_id'])))
            {
                $pages[]=$page['page_id'];
                $pages = nav(get_pages($page['page_id']),$pages); 
            }   
        }
    }
    echo "</ul>";
    return $pages;
} 

类似地修改了函数调用

<?php echo nav(get_pages(NULL),$pages=array())?>