PHP 生成 UL LI , UL LI
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5580230/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
PHP Generate UL LI , UL LI
提问by
Can't figure out how-to generate this menu using a while-loop.
无法弄清楚如何使用 while 循环生成此菜单。
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:
我的 dbtable 看起来像:
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.
当来自父级的 type == id 时,它应该是子菜单。在我的示例中,这是有效的,现在我必须使其动态化。大脑不工作 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>
采纳答案by Gavin Anderegg
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>
回答by Gavin Anderegg
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:
然后,$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
回答by Aqib Shafique
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>';}
}
回答by Fivell
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
在此示例中,使用了 parent_id 列和使用引用构建 ul-li 列表-它仅进行 1 个 sql 查询并使用递归来呈现输出,可以根据您的需要简单地更改此代码
<?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);
}
}