Php 显示包含父类别的类别表
以下是我的表格结构: 菜单表Php 显示包含父类别的类别表,php,mysql,mysqli,Php,Mysql,Mysqli,以下是我的表格结构: 菜单表 id title position -------------------- 1 Test home 2 Test2 home 类别 cid name parent parent_menu -------------------------------- 1 ABC 0 1 2 DEF 0 2 3 GHI 1 0
id title position
--------------------
1 Test home
2 Test2 home
类别
cid name parent parent_menu
--------------------------------
1 ABC 0 1
2 DEF 0 2
3 GHI 1 0
4 JKL 2 0
类别描述
id cat_id catdesc slug
-------------------------------
1 1 ABC_DESC abc
2 2 DEF_DESC def
3 3 GHI_DESC ghi
4 4 JKL_DESC jkl
处理菜单标题和位置菜单表
处理类别名称和其他参数。(如果parent=0,则表示这是主类别,依此类推)类别表
处理描述、slug和其他参数类别描述表
Name Description Edit Delete /*table headings*/
-------------------------------------------------------
Menu Title: (Test) Main Category Name: (ABC)
------------------------------------------------------
GHI GHI_DESC edit_icon delete_icon
______________________________________________________
Menu Title: (Test2) Main Category Name: (DEF)
------------------------------------------------------
JKL JKL_DESC edit_icon delete_icon
<?php $i = 1; foreach($subcat as $sub) { ?>
<?php if($sub->parent == 0) { ?>
<tr><td><?php echo $sub->name ?></td></tr>
<?php } ?>
<?php if($sub->parent != 0) { ?>
<tr><td><?php echo $sub->name ?></td><td><?php echo $sub->catdesc ?></td>
<td>Edit</td><td>Delete</td></tr>
<?php } ?>
<?php } ?>
我尝试在PHP中使用连接和操作数据,但没有成功
SELECT * FROM `category` t1 LEFT JOIN `category_description` t2 ON t1.cid = t2.cat_id WHERE 1
然后在PHP中,我尝试如下
Name Description Edit Delete /*table headings*/
-------------------------------------------------------
Menu Title: (Test) Main Category Name: (ABC)
------------------------------------------------------
GHI GHI_DESC edit_icon delete_icon
______________________________________________________
Menu Title: (Test2) Main Category Name: (DEF)
------------------------------------------------------
JKL JKL_DESC edit_icon delete_icon
<?php $i = 1; foreach($subcat as $sub) { ?>
<?php if($sub->parent == 0) { ?>
<tr><td><?php echo $sub->name ?></td></tr>
<?php } ?>
<?php if($sub->parent != 0) { ?>
<tr><td><?php echo $sub->name ?></td><td><?php echo $sub->catdesc ?></td>
<td>Edit</td><td>Delete</td></tr>
<?php } ?>
<?php } ?>
请根据需要建议如何打印 您可以使用旧的MySQL方法:
select mt.title, cat.name, cdesc.catdesc from menu_title mt, category cat, category_description cdesc where mt.id = cat.parent_menu and cat.cid = cdesc.cat_id
假设父菜单来自菜单表中的id,请尝试以下操作:
SELECT t1.title, t2.name, t2.parent, t2.parent_menu, t3.catdesc
FROM menu t1
LEFT JOIN category t2 ON t1.id=t2.parent_menu
LEFT JOIN description t3 ON t2.cid=t3.cat_id
GROUP BY t2.name
和我建议您构建一棵树,然后在ArrayIterator和RecursiveIterator的帮助下在树上迭代。
要构建树,您可以调整此代码示例:
$tree = array();
foreach($result_set as $result) {
if ($result["parent"] == 0) {
$tree["cat"][$result["cid"]]["parent"] = $result;
} else {
$tree["cat"][$result["parent"]]["child"][$result["cid"] = $result;
}
}
记住:你必须调整它然后可以实现迭代器,如下所示:
class CategorieTreeIterator extends ArrayIterator implements RecursiveIterator
{
public function getChildren()
{
$link_data = $this->current();
$cid = key($link_data["cat"]);
return new CategorieTreeIterator($link_data["cat"][$cid]["child"]);
}
public function hasChildren()
{
$link_data = $this->current();
$cid = key($link_data["cat"]);
return !empty($link_data["cat"][$cid]["child"]);
}
}
同样,您必须调整它。要显示数据,您现在可以使用以下方法迭代:
$cat_tree_iter = new CategorieTreeIterator($tree);
$rec_iter_iter = new RecursiveIteratorIterator($cat_tree_iter, RecursiveIteratorIterator::SELF_FIRST);
foreach($rec_iter_iter as $iter) {
//display data with help of $iter->getDepth();
}
但这就是我正在做的。。您选择了特定列。您的查询不会返回GHI和JKL名称以及有关它们的说明。。我说只有对GHI和JKL的描述应该是reurnedi调整了你的查询,现在我得到了想要的东西:)。。谢谢,当您有相同的t2时,这会产生问题。名称:(我用demo更新了我的答案。联接中的问题是由于父菜单字段中的零(0)数据。这很好,但数据没有像我提到的那样显示。:(这在我的情况下很复杂;)我知道它看起来很复杂,但实际上并不复杂您只需创建一个类和树,使用上面代码的提示应该不会太难。。。此外,如果您将来添加子类别,它将很容易实现。但如果它能与SQL一起工作,现在也可以了对如果我没有错的话,那么它应该作为助手类包含在MVC中??是的,这样你就可以很容易地重用它,但我的问题是,它应该是新类还是应该扩展现有的助手类(坏主意;)