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