Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Kategoriehierarchie (PHP/MySQL)

Wenn Sie ein Adjazenzlistenmodell verwenden, können Sie die Struktur in einem Durchgang generieren.

Aus One ​​Pass Parent- Child Array Structure (September 2007; von 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;
    }
}

Aus dem verlinkten Artikel ist hier ein Ausschnitt zum Erstellen einer Liste für die Ausgabe. Es ist rekursiv, wenn es Kinder für einen Knoten gibt, ruft es sich selbst erneut auf, um den Teilbaum aufzubauen.

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

Verwandte Frage: