簡體   English   中英

PHP的遞歸功能,以建立菜單

[英]php recursive function to built menu

我試圖使用PHP構建遞歸菜單,但未成功

mysql表

menuid name parentid

和我的PHP代碼

function generateMenubar()
{
    $data = Yii::app()->db->createCommand("select * from menu");

    $result = $data->queryAll();        

    $html = '<ul class = "navigation">';

    foreach($result as $row)
    {
        if($row['parentid'] == "0")
        {
            $html .= '<li><a href="#"><span>'.$row["menuname"].'</span></a>';

            $menu_id = $row['menuid'];

            $html .= $this->generateHTML($result,$menu_id,$html);
        }
    }       

    return $html;
}

function generateHTML($result,$menu_id,$html)
{       
    foreach($result as $row_sub)
    {
        if($menu_id == $row_sub['parentid'])
        {
            $html .= '<ul><li><a href="buttons.html"><span>'.$row_sub['menuname'].'</span></a>';

            $menu_id = $row_sub['menuid'];
            $html .= $this->generateHTML($result,$menu_id,$html);
            $html .= '</li>';
        }           
    }
    return $html.'</ui>';
}

但是此循環不會停止並生成錯誤的輸出。 它最多可以具有n級子級。 我想使它的動態Cuz水平在將來可能有任何建議改變?

您的問題是沒有迭代的結構化結果。 您可能將SubElement 2 > 3 > 4作為第一個結果,但將2 > 3 > 1作為第五個結果。 因此,您不能只遍歷一次結果並生成html。

您想要做的事情(從切換到嵌套集 ,這是您真正想做的眨眼 ),首先要構造您的結果。

遍歷您的結果並構建一個嵌套數組,以循環方式遍歷以構建HTML。 要在遞歸數組中找到“將元素放置在何處”,您還需要始終遞歸檢查現有數組。 如果您存儲的所有內容都是id和parent id,那么在檢查所有元素之前如何找出根元素是正確的? 所以我可以編寫代碼來這樣做,但我寧願不這樣做,因為無論如何這將是一個可怕的解決方案。 為了更有效地執行此操作,如果您不僅存儲您的父代信息,還存儲一個級別,那將真正有幫助。 然后,您可以將元素存儲在二維數組中,該數組存儲每個級別的所有元素,然后遞歸使用該數組。

$navigationTempArray = array();
foreach($fakeMySQLResult as $row)
{
    if(!array_key_exists($row['level'], $navigationTempArray )) {
        $navigationTempArray[$row['level']] = array();
    }
    if(!array_key_exists($row['parentid'], $navigationTempArray[$row['level']] )) {
        $navigationTempArray[$row['level']][$row['parentid']] = array();
    }
    $navigationTempArray[$row['level']][$row['parentid']][] = $row;
}

現在你有一個像這樣的數組:

array (
  0 => array(
    'root' => array(
      1 => array('title' => 'Start' ...)
      2 => array('title' => 'Team' ...)
      3 => array('title' => 'Projects' ...)
    )
  ),
  1 => array(
    2 => array(
      4 => array('title' => 'Development' ...)
      5 => array('title' => 'Design' ...)
      6 => array('title' => 'Sales' ...)
    ),
    3 => array(
      7 => array('title' => 'Mayhem' ...)
      8 => array('title' => 'X' ...)
    )
  ),
  2 => array(
    4 => array(
      9 => array('title' => 'PHP' ...)
     10 => array('title' => 'MySQL' ...)
    )
  )
)

現在,您可以遞歸遍歷此數組,將每個項目的每個級別求解為無窮大 ;-)

function returnSubNavigation($id,$level,$fullNavigationArray) {
$html = '';
if(array_key_exists($level, $fullNavigationArray) && array_key_exists($id, $fullNavigationArray[$level])) {
    $html .= '<ul>';
    foreach($fullNavigationArray[$level][$id] as $subElement) {
        $html .=  '<li><a href="#"><span>'.$subElement["menuname"].'</span></a>';
        $html .=  returnSubNavigation($subElement['id'], $level+1, $fullNavigationArray);
        $html .=  '</li>';
    }
    $html .= '</ul>';

}
return $html;

}

echo returnSubNavigation('root', 0, $navigationTempArray);

這是一種在線小提琴,證明它是有效的

一些不想使用嵌套集的人經常存儲路徑而不是父ID。 即:

| id   | path |
|    1 |    1 |
|    2 |    2 |
|    3 |  1.1 |
|    4 |  1.2 |
|    5 |  2.1 |
|    6 |    3 |

迭代起來很容易(就性能而言更便宜)。 您可以輕松地對其進行排序。 盡管如此,它仍然帶來許多問題和限制。

暫無
暫無

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

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