2

私はこれについて調査しましたが、正確な答えを見つけることができませんでした。これに関するここでの質問/回答のほとんどは未完成のようです。私の質問に似た完成した解決策を誰かが知っているなら、その方向に私を向けてください!

これが私の配列です:

Array
(
['home'] => Array
    (
        [0] => sub-home1
        [1] => sub-home2
    )

['about'] => Array
    (
        [0] => sub-about
        ['about2'] => Array
            (
                [0] => sub-sub-about
            )

    )

['staff'] => Array
    (
        [0] => sub-staff1
        [1] => sub-staff2
    )

['contact'] => contact
)

そして、これが私がそれを変えたいものです:

<ul>
    <li><a href="">home<a/>
        <ul>
            <li><a href="">sub-home1</a></li>
            <li><a href="">sub-home2</a></li>
        </ul>
    </li>
    <li><a href="">about<a/>
        <ul>
            <li><a href="">sub-about</a></li>
            <li><a href="">about2</a>
                <ul>
                    <li><a href="">sub-sub-about<a/></li>
                </ul>
            </li>
        </ul>
    </li>
    <li><a href="">staff<a/>
        <ul>
            <li><a href="">sub-staff1</a></li>
            <li><a href="">sub-staff2</a></li>
        </ul>
    </li>
    <li><a href="">contact<a/></li>
</ul>

配列は動的に生成されますが、3レベルの制限があります(例:about-> about2-> sub-sub-about)。私はこの質問から抜け出そうとしました:PHP / MySQLナビゲーションメニューですが、実際には結論に達していないようでしたか?私はforeachのwhileとforループに精通していますが、これに頭を包むことができないようです。

編集:Enzino、あなたのコードは機能します!

4

4 に答える 4

11

これが私の解決策です:

<?php

function MakeMenu($items, $level = 0) {
    $ret = "";
    $indent = str_repeat(" ", $level * 2);
    $ret .= sprintf("%s<ul>\n", $indent);
    $indent = str_repeat(" ", ++$level * 2);
    foreach ($items as $item => $subitems) {
        if (!is_numeric($item)) {
            $ret .= sprintf("%s<li><a href=''>%s</a>", $indent, $item);
        }
        if (is_array($subitems)) {
            $ret .= "\n";
            $ret .= MakeMenu($subitems, $level + 1);
            $ret .= $indent;
        } else if (strcmp($item, $subitems)){
            $ret .= sprintf("%s<li><a href=''>%s</a>", $indent, $subitems);
        }
        $ret .= sprintf("</li>\n", $indent);
    }
    $indent = str_repeat(" ", --$level * 2);
    $ret .= sprintf("%s</ul>\n", $indent);
    return($ret);
}

$menu = Array(
            'home' => Array("sub-home1", "sub-home2"),
            'about' => Array("sub-about", "about2" => Array("sub-sub-about")),
            'staff' => Array("sub-staff1", "sub-staff2"),
            'contact' => "contact"
        );

print_r($menu);

echo MakeMenu($menu);

?>
于 2012-07-31T19:38:09.613 に答える
4

Calvinのソリューションは私のために働いた。これが編集されたバージョンです。より多くのネストされたループを使用して、sub-subメニュー項目を取得できます。

echo '<ul>';
foreach ($menu as $parent) {

    echo '<li><a href="#">' . $parent . '</a>';

    if (is_array($parent)) {
        echo '<ul>';
            foreach ($parent as $children) {
                echo '<li><a href="#">' . $children . '</a>';
            }
        echo '</ul>';
    }

    echo '</li>';
}
echo '</ul>';
于 2012-11-12T17:32:06.693 に答える
2

再帰を使用できると思いますか?これは、phpにあまり詳しくない疑似コードです。

function toNavMenu(array A){
    for each element in A{
        echo "<li><a href=\"\">" + element.name + "</a>"
        if (element is an array){
            echo "<ul>"
            toNavMenu(element)
            echo "</ul>"
        }
        echo "</li>"
    }
}
于 2012-07-31T19:12:52.490 に答える
2

おそらく、配列を次のように少し調整します。

Array(
    0 => Array(
        'title' => 'Home',
        'children' => Array()
    ),
    1 => Array(
        'title' => 'Parent',
        'children' => Array(
            0 => Array(
                'title' => 'Sub 1',
                'children' => Array(),
            ),
            1 => Array(
                'title' => 'Sub 2',
                'children' => Array(
                    0 => Array(
                        'title' => 'Sub sub 2-1',
                        'children' => Array(),
                    ),
                ),
            ),
        )
    )
) 

このような構造では、再帰を使用してメニューHTMLを作成できます。

function buildMenu($menuArray)
{
    foreach ($menuArray as $node)
    {
        echo "<li><a href='#'/>" . $node['title'] . "</a>";
        if ( ! empty($node['children'])) {
            echo "<ul>";
            buildMenu($node['children']);
            echo "</ul>";
        }
        echo "</li>";
    }
}
于 2012-07-31T19:17:29.060 に答える