2012-08-08 46 views
0

我的目標是創建具有無限深度樹的導航菜單。我可以成功地生成前兩個級別。第一個(頂級)使用未存儲在XML文件中的PHP數組。第二個是從一個平面的xml文件生成的。主要問題是成功的遞歸。自引用XML樹來創建多層無序列表

下面是XML結構:

<articles> 
    <article> 
     <menu parent="Insurance" label="Business" target="#" show="true" /> 
     <data /> 
     <body /> 
    </article> 
    <article> 
     <menu parent="Resources" label="Videos" target="content.php#videos" show="true" /> 
     <data /> 
     <body /> 
    </article> 
    <article> 
     <menu parent="Business" label="Disability" target="content.php#disability" show="true" /> 
     <data /> 
     <body /> 
    </article> 
    <article> 
     <menu parent="Business" label="Liability" target="content.php#liability" show="true" /> 
     <data /> 
     <body /> 
    </article> 

</articles> 

我正在使用#我的目標屬性,以確定是否需要啓動一個新的列表(子菜單)。

的PHP代碼,我收到的成功與輸出正確的信息是:

$objXMLMenu = simplexml_load_file('menu.xml'); 
    foreach ($mainmenu as $menuparent) { //Main Array 

     echo "<li><a href=\"" .$maintargets[$i]. "\">". $menuparent ."</a>\n"; // Top Menu array. I use 2 for clarity 
     if ($maintargets[$i] == "#"){ 


      //Open the ULs for filling 
      echo "\t<ul>\n"; 

    // Start function here? 

      foreach($objXMLMenu->article as $art){ 

       foreach($art->menu as $menuitem){ 

        if($menuitem['parent'] == $menuparent){ //Compare to Main Array 

         if ($menuitem['show'] == "true"){ 

          if($menuitem['target'] == "#"){ //A Submenu exits here 
           echo "\t\t<li><a href=\"" . $menuitem['target'] . "\" >" .$menuitem['label'] . "</a></li>\n"; 
           echo "\t\t\t<ul>\n"; 
           //Run XMLQUERY match? As a 

           echo "\t\t\t</ul>\n"; 
          }else{ 
           echo "\t\t<li><a href=\"" . $menuitem['target'] . " \"rel=\"ajax\">" .$menuitem['label'] . "</a></li>\n"; 
          } 
         } 

        } 
       } 

      } 
      //Close Middle Menus 
      echo "\t</ul>"; 
     } 
     $i++; 
     //close Top Level Menu Item 
     echo "</li>\n"; 
    } 
//<UL> Footer 
echo "\t</ul>\n</div>\n"; 

在試圖讓一個遞歸函數我收到一個錯誤與我的第一個foreach語句,這表明我,我應該切換到DOM & XPATH而不是simplexml。這裏是我到目前爲止的功能:

$objXMLMenu = simplexml_load_file('menu.xml'); 
// Start function here! 
function mysubmenu($menuparent){ 
    foreach($objXMLMenu->article as $art){ 
     foreach($art->menu as $menuitem){ 
      if($menuitem['label'] == $menuparent){ 
      //Compare to Main Array 
       if ($menuitem['show'] == "true"){ 

        if($menuitem['target'] == "#"){ 
         // ((ROOT) 
         //A Submenu exits here 
         $strResponse .= "\t\t<li><a href=\"" . $menuitem['target'] . " \">" .$menuitem['label'] . "</a></li>\n"; 
         $strResponse .= "\t\t\t<ul>\n"; 

         //xmlpath QUERY instead? 
         mysubmenu($menuitem['parent']); 

         $strResponse .= "\t\t\t</ul>\n"; 
        }else{ 
         $strResponse .= "\t\t<li><a href=\"" . $menuitem['target'] . " \"rel=\"ajax\">" .$menuitem['label'] . "</a></li>\n"; 
        } 
       } 

      } 
     } 
     //insert counter to stop foreach loop after all records are posted. 
    } 
    return $strResponse; 
} //End Function 

遞歸這種類型是我的一個新的邊界。我發現的每個例子或解釋都涉及XML樹進一步深入到元素。 「深度」(計數器)屬性不是一個選項。因爲我在一個「延期」項目上面臨類似的問題,這個項目的確是無限的深度。

回答

0

對程序風格起作用的東西在函數中不起作用。我最煩惱的方面是在comparing SimpleXML objects。有大約5行需要改變。儘管對於更長的遞歸,但可能有更簡單快捷的方式來獲得此答案。但我現在發現這個工程。

function mysubmenu($menuparent){ 
    $objXMLMenu = simplexml_load_file('menu.xml'); 
    foreach($objXMLMenu->article as $art){ 
     foreach($art->menu as $menuitem){ 

      if((string)$menuitem['parent'] == $menuparent){ 
       if ($menuitem['show'] == "true"){ 
        if($menuitem['target'] == "#"){ 
         echo "\t\t<li><a href=\"" . $menuitem['target'] . "\">" .$menuitem['label'] . "</a></li>\n"; 
         echo "\t\t\t<ul>\n"; 
         mysubmenu($menuitem['label']); 
         echo "\t\t\t</ul>\n"; 
        }else{ 
         echo "\t\t<li><a href=\"" . $menuitem['target'] . "\" rel=\"ajax\">" .$menuitem['label'] . "</a></li>\n"; 
        } 
       } 


      } 
     } 

    } 

} //End Function