sql >> Database >  >> RDS >> Mysql

Echo-menustructuur met recursieve functie

Wat dacht je van:

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

Deze functie vereist dat u eerst uw database doorzoekt voor de volledige lijst met beschikbare categorieën en neemt aan dat uw hoofdcategorieën de waarde null hebben, maar de functie kan worden gewijzigd om -1 of 0 te accepteren, afhankelijk van hoe uw huidige schema werkt.

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

U kunt overwegen het volgende te doen om te voorkomen dat er lege UB's verschijnen als er geen onderliggende items zijn voor de ouder:

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

De beste oplossing zou echter zijn om uw gegevens te selecteren om een ​​kolom op te nemen met het aantal onderliggende categorieën dat elke categorie heeft.

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

Waarin jouw functie zou zijn:

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

Hoop dat dat helpt?




  1. Databasetijdzone instellen voor een AWS RDS-instantie

  2. Foutcode:1290. De MySQL-server wordt uitgevoerd met de optie --secure-file-priv, zodat deze instructie niet kan worden uitgevoerd

  3. Geef het begin van de maand terug in SQLite

  4. MySQL-fout omzeilen Deadlock gevonden bij het proberen te vergrendelen; probeer de transactie opnieuw te starten