菜单PHP SQL总是将<ul>放在代码中

时间:2015-09-13 14:33:53

标签: php html

首先,我试图从我的数据库中回显我的HTML菜单数据。那部分工作正常。问题是,当我使用下面的代码时,它总是放

<ul></ul>

每个菜单项后。但是如果实际存在子菜单,我只想要<ul>元素。

foreach($items as $item) {
    if($item['parent_id'] == 0) {
        echo "<li><a href='#'>".$item['menu']."</a>";
        $id = $item['id'];
        sub($items, $id);
        echo "</li>";
    }
}
echo "</ul>";

function sub($items, $id) {
    echo "<ul>";
    foreach($items as $item) {
        if($item['parent_id'] == $id) {
            echo "<li><a href='#'>".$item['menu']."</a>";
            sub($items, $item['id']);
            echo "</li>";
        }
    }
    echo "</ul>";
}

?>

这是HTML结果:

<li><a href='#'>united states</a><ul>
<li><a href='#'>texas</a><ul></ul></li
<li><a href='#'>montana</a><ul></ul></li>
<li><a href='#'>washington</a><ul></ul></li></ul></li>
<li><a href='#'>india</a><ul>
<li><a href='#'>Maharashtra</a><ul></ul></li>
<li><a href='#'>Bihar</a><ul></ul></li>
<li><a href='#'>karnataka</a><ul>
<li><a href='#'>bangalore</a><ul></ul></li>
<li><a href='#'>belgaum</a><ul></ul></li>
<li><a href='#'>mysore</a><ul>
<li><a href='#'>brindavan</a><ul></ul></li>
<li><a href='#'>mysore palace</a><ul></ul></li></ul></li></ul></li></ul></li>
<li><a href='#'>russia</a><ul>
<li><a href='#'>moscow</a><ul></ul></li></ul></li>
<li><a href='#'>britan</a><ul></ul></li></ul>                   

你可以看到它把

<ul></ul> 

每次菜单项后。我该如何摆脱它?

2 个答案:

答案 0 :(得分:1)

在function sub()中尝试检查$ items

If count($items) > 0 then echo <ul>, run foreach and echo </ul>

答案 1 :(得分:0)

变化:

function sub($items, $id) {
    echo "<ul>";
    foreach($items as $item) {
        if($item['parent_id'] == $id) {
            echo "<li><a href='#'>".$item['menu']."</a>";
            sub($items, $item['id']);
            echo "</li>";
        }
    }
    echo "</ul>";
}

function sub($items, $id) {

    if($this->hasChildren($items, $id)){
        echo "<ul>";
        foreach($items as $item) {
            if($item['parent_id'] == $id) {
                echo "<li><a href='#'>".$item['menu']."</a>";
                sub($items, $item['id']);
                echo "</li>";
            }
        }
        echo "</ul>";
    }
}

function hasChildren(array $array, $parent_id)
{
   foreach($array as $item)
   {
      if($item['parent_id'] === $parent_id) return true;
   }

   return false;
}

你需要确保在循环之前通过计算它们来实际拥有物品。目前,如果您没有$items,则仍然会写<ul></ul>

在回显count之前添加<ul>意味着您只输出<ul>并执行循环,如果您至少有1个项目。