PHP Generate UL LI , UL LI

2019-07-07 02:08发布

Can't figure out how-to generate this menu using a while-loop.

This is an example of my code:

<ul id="nav">
<li><a href="#">Hoofdmenu 1</a>
<ul class="sub">
        <li><a href="#">Submenu 1.1</a></li>
        <li><a href="#">Submenu 1.2</a></li>
        <li><a href="#">Submenu 1.3</a></li>
        <li><a href="#">Submenu 1.4</a></li>
    </ul>
</li>

<li><a href="#">Hoofdmenu 2</a>
    <ul class="sub">
        <li><a href="#">Submenu 2.1</a></li>
        <li><a href="#">Submenu 2.2</a></li>
        <li><a href="#">Submenu 2.3</a></li>
        <li><a href="#">Submenu 2.4</a></li>
    </ul>
</li>
</ul>

My dbtable looks like:

paginas:
    id
    title
    content
    type

When type == id from the parent it should be the submenu. In my example this works, now I've got to make it dynamic. Brains ain't working atm.

Thanks for your help!

Used code to get data from db:

<ul id="nav">
<?php
include_once("ond/inc/php/connect.php");
$query = "SELECT * FROM paginas WHERE type = '0'";
$result = mysql_query($query);
while($row = mysql_fetch_object($result)){

echo '<li><a href="?ond='.$row->titel.'">'.$row->titel.'</a>';}
echo '<ul class="sub">';

$query2 = "SELECT * FROM paginas WHERE type = '".$row->id."'";
$result2 = mysql_query($query2);    
while($row2 = mysql_fetch_object($result2))
{
    echo '<li><a href="?ond='.$row2->titel.'">'.$row2->titel.'</a></li>';
}
echo '</ul>'; 
echo '</li>';

?>
</ul>

3条回答
唯我独甜
2楼-- · 2019-07-07 02:35

in this example parent_id column used and ul-li list build with references- it makes only 1 sql query and use recoursion for rendering output, this code can be simply changed for your needs

        <?php
 /**
  * Module for displaying data from items table
  */
class App_Modules_Tree  extends   App_AbstractModule {

    /**
        * array for storing data
        *
        * @var array
        */
    private $tree = array();
       /**
        * html - output of current module
        *
        * @var string
        */
        private $output = ''; 

      /**
       * Retreives data from table items.
       *
       * @return void
       */
        private function _getData()
    {
        $pdo = App_Registry::get('pdo');
        $levels = array();
        foreach ($pdo->query('SELECT * FROM items ORDER BY parent_id ASC',PDO::FETCH_OBJ) as $k=>$v){
                   // references
             $current =  &$levels[ $v->id ] ;
                 $current['parent_id'] = $v->parent_id;
                 $current['name'] = $v->name;
                 if (0 == $v->parent_id){
                 $this->tree[ $v->id ] = &$current;
                 } else {
             $levels[$v->parent_id ]['children'][$v->id] = &$current;
                 }
        }
    }   

    /*
    *App_AbstractModule::preRender overriding
        * @return void
    */
    protected  function preRender()
    {
        $this->_getData();
        }
      /**
       * recursively build html output.
       *
       * @return string
       */
    private function _render($arr)
    {
        $this->output.= '<ul>';
        foreach ($arr as $k=>$v)
        {
            $this->output.= '<li>'.$v['name'].'</li>';
            if( !empty($v['children'])){
                $this->_render($v['children']);
            }
        }
        $this->output.= '</ul>';
        return $this->output;
    }
    /*
    *App_AbstractModule::render overriding
        * @return string
    */
    protected  function render()
    {
            return $this->_render($this->tree);
    }

}
查看更多
ゆ 、 Hurt°
3楼-- · 2019-07-07 02:38

Next lines did the solution:

<ul id="nav">
<?php
include_once("ond/inc/php/connect.php");
$query = "SELECT * FROM paginas WHERE type = '0'";
$result = mysql_query($query);
while($row = mysql_fetch_object($result)){

echo '<li><a href="?ond='.$row->titel.'">'.$row->titel.'</a>';

$query2 = "SELECT * FROM paginas WHERE type = '".$row->id."'";
$result2 = mysql_query($query2);    
echo '<ul class="sub">';
while($row2 = mysql_fetch_object($result2))
{   
    echo '<li><a href="?ond='.$row2->titel.'">'.$row2->titel.'</a></li>';


}
    echo '</ul>';
echo '</li>';}



?>
</ul>
查看更多
Anthone
4楼-- · 2019-07-07 02:57

I would do something like this:

First, grab your data out as an array and loop through it for each entry. Then run something like this:

$menuArray = array();

if (empty($type)) // If the entry has no "type", then it's a parent
{
    $menuArray[$type]['title'] = $title;
}
else // else, it's a child, so append it to the parent
{
    $menuArray[$type]['subitems'][] = $title;
}

Then, having $menuArray, loop through it to create the menu:

?><ul id="nav"><?php
foreach ($menuArray as $item)
{
    ?><li><a href="#">$item['title']</a><?php
    ?><ul class="sub"><?php

    foreach ($item['subitems'] as $subItem)
    {
        <li><a href="#">$subItem</a></li>
    }

    ?></ul><?php
    ?></li><?php
}
?></ul><?php
查看更多
登录 后发表回答