Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 显示包含父类别的类别表_Php_Mysql_Mysqli - Fatal编程技术网

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中??是的,这样你就可以很容易地重用它,但我的问题是,它应该是新类还是应该扩展现有的助手类(坏主意;)