[英]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.