私の目的は、無制限の深さのツリーを持つナビゲーション メニューを作成することです。上位 2 レベルを正常に生成できます。1 つ目 (最上位) は、XML ファイル内に格納されていない PHP 配列を使用しています。2 つ目は、フラットな 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 ステートメントでエラーを受け取りました。これは、simplexml ではなく DOM & XPATH に切り替える必要があることを示唆しています。これが私がこれまでに思いついた機能です:
$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 ツリーが要素をさらに深く掘り下げることが含まれています。「深さ」(カウンター) 属性はオプションではありません。それ以来、私は「延期された」プロジェクトで同様の問題に直面していますが、それは時間の経過とともに本当に無制限の深さです。