PHP генерирует UL LI , UL LI

#php #html-lists #suckerfish

#php #html-списки #suckerfish

Вопрос:

Не могу понять, как сгенерировать это меню с помощью цикла while.

Это пример моего кода:

 <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>
  

Моя таблица db выглядит следующим образом:

 paginas:
    id
    title
    content
    type
  

При вводе == id из родительского файла это должно быть подменю.
В моем примере это работает, теперь я должен сделать это динамическим.
Мозги не работают atm.

Спасибо за вашу помощь!

Используемый код для получения данных из базы данных:

 <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. Мозг не работает? Вы снова потребляете свои собственные продукты? 🙂 В любом случае, добро пожаловать в SO. Для этого требуется дополнительная информация: Какую библиотеку базы данных вы используете? Каким кодом у вас есть для подключения к базе данных и извлечения записей? Опубликуйте этот код, и люди смогут дать вам указания, как это сделать. Если у вас пока ничего нет, вам следует сначала взглянуть на приличный учебник по программированию баз данных на PHP и задать конкретные вопросы, если вы наткнетесь на препятствие.

2. Для меня это тоже выглядит довольно ясно, imo; p в любом случае, я использую базу данных mysql. Мой php приличный, но мой мозг сегодня не будет работать (алкоголь, марихуана)

3. @Ganjafarmer ну, как уже было сказано, если у вас пока ничего нет, вам следует начать с базового руководства по базам данных, например, этого . Без конкретного вопроса я не вижу здесь ничего, кроме «напиши мой код за меня», что не является миссией и предназначением SO.

4. Пекка, ты прав, я выложу свой php через секунду.

5. И алкоголь и марихуана, вероятно, тоже не помогут в вашем случае. 😉

Ответ №1:

Я бы сделал что-то вроде этого:

Сначала извлеките ваши данные в виде массива и просматривайте его для каждой записи. Затем запустите что-то вроде этого:

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

Затем, выполнив $menuArray цикл по нему, чтобы создать меню:

 ?><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:

В следующих строках было найдено решение:

 <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:

 function load()
{
    global $conn;


    $query = "SELECT *  FROM sub_category WHERE main_category_id='1'";
    $result = mysqli_query($conn,$query);
    while($row = mysqli_fetch_assoc($result)){
        $cat_id=$row['sub_category_id'];

    echo '<li><a href="?id='.$row['sub_category_id'].'">'.$row['sub_category_name'].'</a>';

    $query2 = "SELECT *  FROM categories WHERE sub_category_id='$cat_id'";
    $result2 = mysqli_query($conn,$query2);    
    echo '<ul class="sub">';
    while($row2 = mysqli_fetch_assoc($result2))
    {   
        echo '<li><a href="?id='.$row2['category_id'].'">'.$row2['category_name'].'</a></li>';


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


}
  

Ответ №4:

в этом примере используется столбец parent_id и список ul-li строится со ссылками — он выполняет только 1 sql запрос и использует recoursion для рендеринга выходных данных, этот код можно просто изменить для ваших нужд

         <?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 =  amp;$levels[ $v->id ] ;
                 $current['parent_id'] = $v->parent_id;
                 $current['name'] = $v->name;
                 if (0 == $v->parent_id){
                 $this->tree[ $v->id ] = amp;$current;
                 } else {
             $levels[$v->parent_id ]['children'][$v->id] = amp;$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);
    }

}