PHP Generate UL LI , UL LI

2019-07-07 01:52发布

问题:

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>

回答1:

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


回答2:

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>


回答3:

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);
    }

}