0

私の目的は、無制限の深さのツリーを持つナビゲーション メニューを作成することです。上位 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 ツリーが要素をさらに深く掘り下げることが含まれています。「深さ」(カウンター) 属性はオプションではありません。それ以来、私は「延期された」プロジェクトで同様の問題に直面していますが、それは時間の経過とともに本当に無制限の深さです。

4

1 に答える 1

0

手続き型スタイルで機能したものは、関数では機能しませんでした。私が最も厄介だったのは、SimpleXML オブジェクトの比較です。変更が必要な行は約 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 
于 2012-08-09T13:48:05.920 に答える