sql >> Database teknologi >  >> RDS >> Mysql

Ekko menutræ med rekursiv funktion

Hvad med:

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

Denne funktion kræver, at du først forespørger i din database for hele listen over tilgængelige kategorier og antager, at dine rodkategorier har en værdi på null, men funktionen kan ændres til at acceptere -1 eller 0 afhængigt af, hvordan dit nuværende skema fungerer.

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

Du kan overveje at gøre følgende for at forhindre, at der vises tomme UL'er, når der ikke findes børn for forælderen:

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

Den bedste løsning ville dog være at vælge dine data til at inkludere en kolonne, der indeholder, hvor mange underordnede kategorier hver kategori har.

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

I hvilken din funktion ville væ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>';
}

Håber det hjælper?




  1. Sammenligning af databaseproxy-failover-tider - ProxySQL, MaxScale og HAProxy

  2. SQL-forespørgsel for at få summen af ​​alle kolonneværdier i den sidste række af et resultatsæt sammen med rækkesum (grupper efter)

  3. Databasestyring og overvågning for PostgreSQL 12

  4. Kan %NOTFOUND returnere null efter en hentning?