一尘不染

类别层次结构(PHP / MySQL)

mysql

我试图从我的MySQL数据库中按层次结构获取所有类别和子类别:

我的结果应该是这样(只是示例):

  1. 猫A
    • 子猫1
    • Sub_Sub_Cat 1
    • Sub_Sub_Cat 2
    • 子猫2
  2. 猫B
  3. C猫

MySQL代码:

CREATE TABLE IF NOT EXISTS `categories` (
   `category_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
   `parent_id` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT 'for sub-categories'
  PRIMARY KEY (`category_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;

简而言之,如何在使用 PHP代码 的层次结构中获得它?


阅读 204

收藏
2020-05-17

共1个答案

一尘不染

使用邻接表模型时,您可以一次性生成结构。

取自一遍父子数组结构(2007年9月; Nate
Weiner撰写)

$refs = array();
$list = array();

$sql = "SELECT item_id, parent_id, name FROM items ORDER BY name";

/** @var $pdo \PDO */
$result = $pdo->query($sql);

foreach ($result as $row)
{
    $ref = & $refs[$row['item_id']];

    $ref['parent_id'] = $row['parent_id'];
    $ref['name']      = $row['name'];

    if ($row['parent_id'] == 0)
    {
        $list[$row['item_id']] = & $ref;
    }
    else
    {
        $refs[$row['parent_id']]['children'][$row['item_id']] = & $ref;
    }
}

在链接的文章中,这是一个片段,用于创建输出列表。它是递归的,如果节点有子代,它将再次调用自身以建立子树。

function toUL(array $array)
{
    $html = '<ul>' . PHP_EOL;

    foreach ($array as $value)
    {
        $html .= '<li>' . $value['name'];
        if (!empty($value['children']))
        {
            $html .= toUL($value['children']);
        }
        $html .= '</li>' . PHP_EOL;
    }

    $html .= '</ul>' . PHP_EOL;

    return $html;
}

相关问题:

2020-05-17