0

我有个问题。我想从数据库中创建我的导航(主菜单)。

它工作得很好,也适用于无限的父项。唯一的问题是格式。

输出应如下所示:

<li class="sub">
    <a class="widgets" href="#">Einstellungen</a>
    <ul>
        <li class="sub"> 
            <a href="#">Allgemeines<span>6</span></a>
            <ul>
                <li><a href="">test1</a></li>
            </ul>
        </li> 
        <li><a href="">test2</a></li>             
    </ul>
</li>   

我想你可以看到这背后的结构。

大批:

Array
(
    [1] => Array
        (
            [parent_id] => 0
            [name] => Hauptseite
            [children] => Array
                (
                )

        )

    [2] => Array
        (
            [parent_id] => 0
            [name] => Einstellungen
            [children] => Array
                (
                    [3] => Array
                        (
                            [parent_id] => 2
                            [name] => Allgemeines
                            [children] => Array
                                (
                                    [4] => Array
                                        (
                                            [parent_id] => 3
                                            [name] => test1
                                            [children] => Array
                                                (
                                                )

                                        )

                                )

                        )

                    [5] => Array
                        (
                            [parent_id] => 2
                            [name] => test2
                            [children] => Array
                                (
                                )

                        )

                )

        )

)

更新:

function buildList($testArray) {

    echo '<ul>';
    foreach ($testArray as $id => $menuItem):
        if (isset($menuItem['parent_id']) && $menuItem['parent_id'] == 0): // check if it's a parent category
            echo '<li class="home"><a class="widgets" href="#">' . $menuItem['name'] . ' (' . $id . ')' . '</a>';
            if (isset($menuItem['children'])): // if it has children let's spit them out too
                echo '<ul class="child">';
                outputChildren($menuItem['children']);
                echo '</ul>';

            endif;

        endif;


        if (isset($menuItem['parent_id']) && $menuItem['parent_id'] != 0): // if it's a child let's get it's info
            echo '<li class="sub"><a href="#">' . $menuItem['name'] . '</a>';
            if (isset($menuItem['children'])): // if there are grandchildren let's get them too
                echo '<ul class="child">';

                outputChildren($menuItem['children']);
                echo '</ul>';
            endif;
            echo '</li>';
            continue;
        endif;

        if (isset($menuItem['parent_id']) && $menuItem['parent_id'] == 0): // check if it's a parent category
            echo '</li>';
        endif;
    endforeach;
    echo '</ul>';
}

function outputChildren($child) {

    if (isset($child['name'])):
        echo '<li class="sub"><a href="#">' . $child['name'] . '</a>';
        if (!empty($child['children'])):

            echo '<ul>';
            outputChildren($child['children']);
            echo '</ul>';
        endif;
        echo '</li>';
    endif;
}

$sites = array();

$sql = 'SELECT menu_id, menu_name, parent_id FROM `' .$_config['prefix']. '_menu`';

$result = $db->query($sql);
while ($row = $result->fetch_assoc()) {
    $sites[(int) $row['menu_id']] = array(
        'parent_id' => (int) $row['parent_id'],
        'name' => $row['menu_name'],
        'children' => array()
    );
}

foreach ($sites as $site_id => $site) {
    $sites[$site['parent_id']]['children'][$site_id] = & $sites[$site_id];
}

$sites = $sites[0]['children'];
print_r($sites);


echo buildList($sites);

将输出:

 <ul>
     <li class="home">
         <a class="widgets" href="#">Hauptseite (1)</a>
         <ul class="child"></ul>
     </li>
     <li class="home">
         <a class="widgets" href="#">Einstellungen (2)</a>
         <ul class="child"></ul>
     </li>
 </ul>

请参阅第一个示例它的外观。

谢谢

4

1 回答 1

0

更新

这是我们的测试数组:

$test = Array([1] => Array(
            'parent_id' => 0,
            'name' => Hauptseite,
            'children' => Array()),
            [2] => Array(
            'parent_id' => 0,
            'name' => Einstellungen,
            'children' => Array([3] => Array(
                                    'parent_id' => 2,
                                    'name' => 'Allgemeines',
                                    'children' => Array([4] => Array(
                                                    'parent_id' => 3,
                                                    'name' => 'test1',
                                                    'children' => Array())
                                                    )
                                            ),
                                [5] => Array(
                                    'parent_id' => 2,
                                    'name' => 'test2',
                                    'children' => Array()
                                            )
                                )
                )

        );

为了得到想要的结果,我们将采取以下步骤:

1) 如果父 ID = 0,则为父(否则为子)

2)如果isset($item['children'])那时我们需要吐出孩子(可能还有孙子)

这是代码:

function buildList($testArray) {

    echo '<ul>';
    foreach ($testArray as $id => $menuItem):
        if (isset($menuItem['parent_id']) && $menuItem['parent_id'] == 0): // check if it's a parent category
            echo '<li class="home"><a class="widgets" href="#">' . $menuItem['name'] . ' (' . $id . ')' . '</a>';
            if (isset($menuItem['children'])): // if it has children let's spit them out too
                echo '<ul class="child">';
                outputChildren($menuItem['children']);
                echo '</ul>';

            endif;

        endif;


        if (isset($menuItem['parent_id']) && $menuItem['parent_id'] != 0): // if it's a child let's get it's info
            echo '<li class="sub"><a href="#">' . $menuItem['name'] . '</a>';
            if (isset($menuItem['children'])): // if there are grandchildren let's get them too
                echo '<ul class="child">';

                outputChildren($menuItem['children']);
                echo '</ul>';
            endif;
            echo '</li>';
            continue;
        endif;

        if (isset($menuItem['parent_id']) && $menuItem['parent_id'] == 0): // check if it's a parent category
            echo '</li>';
        endif;
    endforeach;
    echo '</ul>';
}

function outputChildren($child) {

    if (isset($child['name'])):
        echo '<li class="sub"><a href="#">' . $child['name'] . '</a>';
        if (!empty($child['children'])):

            echo '<ul>';
            outputChildren($child['children']);
            echo '</ul>';
        endif;
        echo '</li>';
    endif;
}

您可以将echo语句更改为$htmm .=

于 2013-01-20T18:26:31.287 回答