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

Echo-Menübaum mit rekursiver Funktion

Wie wäre es mit:

function recurse($categories, $parent = null, $level = 0)
{
    $ret = '<ul>';
    foreach($categories as $index => $category)
    {
        if($category['root'] == $parent)
        {
            $ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>';
            $ret .= $this->recurse($categories, $category['id'], $level+1);
            $ret .= '</li>';
        }
    }
    return $ret . '</ul>';
}

Diese Funktion erfordert, dass Sie zuerst Ihre Datenbank nach der gesamten Liste der verfügbaren Kategorien abfragen, und geht davon aus, dass Ihre Stammkategorien einen Wert von null haben, aber die Funktion kann so geändert werden, dass sie -1 oder 0 akzeptiert, je nachdem, wie Ihr aktuelles Schema funktioniert.

$categories = { get from database into an multi-dimensional array };
$Tree = $this->recurse($categories);
echo $Tree;

Sie können Folgendes in Betracht ziehen, um zu verhindern, dass leere ULs erscheinen, wenn keine untergeordneten Elemente für das übergeordnete Element vorhanden sind:

function recurse($categories, $parent = null, $level = 0)
{
    $ret = '<ul>';
    foreach($categories as $index => $category)
    {
        if($category['root'] == $parent)
        {
            $ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>';
            $sub = $this->recurse($categories, $category['id'], $level+1);
            if($sub != '<ul></ul>')
                $ret .= $sub;
            $ret .= '</li>';
        }
    }
    return $ret . '</ul>';
}

Die beste Lösung wäre jedoch, Ihre Daten so auszuwählen, dass sie eine Spalte enthalten, die angibt, wie viele untergeordnete Kategorien jede Kategorie hat.

select Category.*, (select count(distinct c1.id) from Category as c1 where c1.root = Category.id) as ChildCount from Category

In welcher Ihre Funktion wäre:

function recurse($categories, $parent = null, $level = 0)
{
    $ret = '<ul>';
    foreach($categories as $index => $category)
    {
        if($category['root'] == $parent)
        {
            $ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>';
            if($category['ChildCount'] > 0)
                $ret .= $this->recurse($categories, $category['id'], $level+1);
            $ret .= '</li>';
        }
    }
    return $ret . '</ul>';
}

Hoffe das hilft?