php - 我如何在最多 4 个级别的树中选择类别

标签 php mysql

我正在尝试创建层次结构/树中所有类别的二维数组。

所以父类别先出现,然后是它的子类别,然后是第 3 级类别,然后是第 4 级类别。

我有一个表有这样的记录

 cc_id    category_name   parent_id  level
  1          general         0         1
  2          Books           1         2
  3          Magazines       1         2
  4          English Book    2         3
  5          Love Story      4         4

我想要这样的输出

Array
(
[0] => Array
    (
        [cc_id] => 1
        [parent_id] => 0
        [category_name] => General
        [level] => 1
    )

[1] => Array
    (
        [cc_id] => 2
        [parent_id] => 1
        [category_name] => Books
        [level] => 2
    )

[2] => Array
    (
        [cc_id] => 4
        [parent_id] => 2
        [category_name] => English Book
        [level] => 3
    )
    [3] => Array
    (
        [cc_id] => 4
        [parent_id] => 3
        [category_name] => Love Story
        [level] => 4
    )
    [4] => Array
    (
        [cc_id] => 3
        [parent_id] => 1
        [category_name] => Magazine
        [level] => 2
    )

 )

如果我可以在同一页面上混合 html 和 php 代码,我可以实现这一点。但是我使用的是 MVC 结构,所以这是我的要求,我按嵌套顺序创建一个数组。因为我不能在我的内部使用 if else 条件查看页面。

我在我的 Controller /lib 文件中尝试的是

    $result = $DB->query("SELECT *
    FROM " . DB_PREFIX . "classified_categoies 
    WHERE is_publish=1");
//------------------------------------------------
// Check if resultset contains any rows
//------------------------------------------------
if ($DB->num_rows($result))
{
    $i = 0;
    //------------------------------------------------
    // Fetch resultset
    //------------------------------------------------
    while( $obj = $DB->fetch_object($result) )
    {
        //------------------------------------------------
        // Set values
        //------------------------------------------------

        if($obj->parent_id==0 and $obj->level==1)
        {
        $entries_obj[$i]['category_id'] = $obj->cc_id;
        $entries_obj[$i]['parent_id'] = $obj->parent_id;
        $entries_obj[$i]['category_name'] = $obj->category_name;
        $entries_obj[$i]['level'] = $obj->level;
        $i++;
        }

        $result2 = $DB->query("SELECT *
        FROM " . DB_PREFIX . "classified_categoies 
        WHERE is_publish=1 AND parent_id=".$obj->cc_id." order by level asc");

        if ($DB->num_rows($result))
        {
            while( $obj2 = $DB->fetch_object($result2) )
            {
                if($obj->level==2)
                {
                    $entries_obj[$i]['category_id'] = $obj2->cc_id;
                    $entries_obj[$i]['parent_id'] = $obj2->parent_id;
                    $entries_obj[$i]['category_name'] = $obj2->category_name;
                    $entries_obj[$i]['level'] = $obj2->level;
                    $i++;
                }
            }

        }

    }

但通过这样做,我最多可以得到 2 级类别。似乎通过使用上面的逻辑我必须编写 4 个查询。有没有任何有效的方法你们可以建议请。谢谢..

一般输出应该是这样的

    Genaral
        Books
           English books
               Love Story
        Magazines

但我想要二维数组中的输出。

最佳答案

一个递归的方法会做...

// First get a simple array of recordset, not as efficient but serves our purpose, so avoid filtering by level...

$baseArray = array();

while( $obj = $DB->fetch_object($result) )
{
  $baseArray[$obj->cc_id] = new array('category_id' => $obj->cc_id,
                                      'category_name' => $obj->category_name,
                                      'parent_id' => $obj->parent_id,
                                      'level' => $obj->level);
}

// Now our recursive method

function getBookCategories($inputArray, $parent = 0, $level = 0){
    $tmpReturn = array();
    foreach($inputArray as $cc_id => $categoryArray){
        if($categoryArray['parent_id'] == $parent){
            $tmpReturn[$cc_id] = $categoryArray;
            if($level < 4){
                $tmpReturn[$cc_id]['children'] = array();
                $tmpReturn[$cc_id]['children'] = getBookCategories($inputArray, $cc_id, $level + 1);
            }
        } 
    }
    return $tmpReturn;

}

编辑

如果您希望它与 $baseArray 相同,则:

function getBookCategories2($inputArray, &$outputArray, $parent = 0, $level = 0){
    foreach($inputArray as $cc_id => $categoryArray){
        if($categoryArray['parent_id'] == $parent){
            $outputArray[] = $categoryArray;
            if($level < 4){
                getBookCategories2($inputArray, $outputArray, $cc_id, $level + 1);
            }
        } 
    }

}

$desiredArray = array();

getBookCategories2($baseArray, $desiredArray, 0, 0);

关于php - 我如何在最多 4 个级别的树中选择类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28053770/

相关文章:

mysql - RMySQL dbWriteTable 只导入第一行?

php - 我想在两列中连续插入一个变量的数据

php - 如何防止SQL注入(inject)?

javascript - 在 PhP 中运行 Javascript 函数或线程

mysql - 在 mysql 子查询中使用外部别名

php - 从另一个页面上的 while 循环外的 mysql 数据库获取表单后复选框变量

php - 表单和数据库之间的日期冲突

php - 没有为菜单实现正确​​的链接 rel CSS 样式表

javascript - 尝试从 C# 中的文本框获取文本值时出错(ASP.NET gridview)

mysql - 条件连接 : don't join on null