php - 类别层次结构 (PHP/MySQL)

标签 php mysql hierarchy categories

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

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

  1. Cat A
    • Sub-Cat 1
      • Sub_Sub_Cat 1
      • Sub_Sub_Cat 2
    • Sub_Cat 2
  2. Cat B
  3. Cat C
  4. ...

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 代码 将其置于层次结构中?

最佳答案

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

取自 One Pass Parent-Child Array Structure (Sep 2007; by 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;
    }
}

从链接的文章中,这里有一段创建输出列表的片段。它是递归的,如果一个节点有 child ,它会再次调用自己来构建子树。

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;
}

相关问题:

关于php - 类别层次结构 (PHP/MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4452472/

相关文章:

mysql - 有没有办法在 mysql 中进行批量/更快的删除?

php - 将 curdate() - 间隔替换为 $variable - 间隔

php - 根据 SLA 计算系统可用性

sql - 选择各自父记录中的子记录总数

php - mysql_fetch_array 仅返回查询的最后一个值

PHP 正则表达式 : Replace substring between two special character

php - 在 apache2 执行 60 秒后网关超时

php - yii phpunit getMockBuilder 不使用 --filter

c# - MEF 容器层次结构和 GetExports<T>

mysql - MySQl 与 SQL Server 与 Oracle 中的分层查询