簡體   English   中英

強制停止PHP中的遞歸

[英]Forcefully Stop Recursion in PHP

這是我將導航欄存儲到會話中的功能

function menu($sp_id,$offset = 0, $ulclass, $liclass) {
        $menudb =new db;

        if($offset == 0)
            $_SESSION['nav_menu'].= "<ul class=\"sf-menu\">";

        if($sp_id == 0)
        {
            $sql = "SELECT `label`, `link` , `sp_id` FROM `nav_menu` ORDER BY `sort` ASC LIMIT $offset,100000000000000";
            $menudb->query($sql);

            while ($row = $menudb->result()->fetch_assoc()) {
                $offset++;
                $_SESSION['nav_menu'].= "<li class=\"$liclass\"><a href='" . $row['link'] . "'>" . $row['label'] . "</a>";

                if($row['sp_id'] != 0){
                    $_SESSION['nav_menu'].= "<div class=\"mobnav-subarrow\"></div>";
                     menu($row['sp_id'],$offset, $ulclass, $liclass);
                }
                else
                    $_SESSION['nav_menu'].="</li>";
            }
        }
        else
        {
            $sql = "SELECT `bt_name` AS label FROM `business_sub_type` WHERE `sp_id` = $sp_id OR `sp_id` = 0";
            $menudb->query($sql);

            $_SESSION['nav_menu'].= "<ul class=\"sf-menu\">";

            while ($row = $menudb->result()->fetch_assoc()) {
                $_SESSION['nav_menu'].= "<li class=\"$liclass\"><a href='#'>" . $row['label'] . "</a></li>";
            }
            $_SESSION['nav_menu'].= "</ul></li>";
            menu(0,$offset, $ulclass, $liclass);
        }
        $_SESSION['nav_menu'].= "</ul>";
//here
}

現在我希望我的函數在/ here處不惜一切代價死掉,但是它一次又一次地重復並重復會話存儲菜單,

並且,如果這是通過將菜單保存到會話中來減少加載時間的正確方法,還請指導我嗎? 謝謝

您甚至不需要對您正在執行的操作進行遞歸。 如果您有一個多層數據庫結構,最初沒有設置深度,則應使用遞歸。 在您的情況下,您似乎只有兩個級別:“ nav_menu”數據庫表和與第一個數據庫表相關的“ business_sub_type”數據庫表。 您要做的只是循環瀏覽“ nav_menu”,並且每個循環瀏覽與之相關的“ business_sub_type”。

只需將您的功能更改為類似的內容

function menu() {
    $menudb =new db;
    $submenu = new db;
    $_SESSION['nav_menu'] = "<ul class=\"sf-menu\">";
    // get all nav_menu items ordered by 'sort' column
    $sql = "SELECT `label`, `link` , `sp_id` FROM `nav_menu` ORDER BY `sort` ASC";
    $menudb->query($sql);
    while ($row = $menudb->result()->fetch_assoc()) {
        $_SESSION['nav_menu'].= "<li class=\"li-menu\"><a href='" . $row['link'] . "'>" . $row['label'] . "</a>";

        if($row['sp_id'] != 0){
            $_SESSION['nav_menu'].= "<div class=\"mobnav-subarrow\"></div>";
            // get all 'business_sub_type' for this nam_menu
            $sql = "SELECT `bt_name` AS label FROM `business_sub_type` WHERE `sp_id` = ".$row['sp_id']." OR `sp_id` = 0";
            // I am not sure the ' OR `sp_id` = 0' part is correct at all 
            $submenu->query($sql);
            $_SESSION['nav_menu'].= "<ul class=\"sf-menu\">";
            while ($row1 = $submenu->result()->fetch_assoc()) {
                $_SESSION['nav_menu'].= "<li class=\"li-menu\"><a href='#'>" . $row1['label'] . "</a></li>";
            }
            $_SESSION['nav_menu'].="</ul></li>";
        }
        else
        {
            $_SESSION['nav_menu'].="</li>";
        }
    }

    $_SESSION['nav_menu'].= "</ul>";
}

並回答有關遞歸的問題。 您可以通過不在內部調用遞歸來停止遞歸。 或者換句話說,定義一個邏輯分支,如果不滿足或滿足某些條件,則在該分支中您不會自調用遞歸函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM