sql >> Databasteknik >  >> RDS >> Mysql

Echo menyträd med rekursiv funktion

Vad sägs om:

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

Denna funktion kräver att du först frågar din databas för hela listan över tillgängliga kategorier och antar att dina rotkategorier har värdet null, men funktionen kan ändras till att acceptera -1 eller 0 beroende på hur ditt nuvarande schema fungerar.

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

Du kan överväga att göra följande för att förhindra att tomma UL visas när det inte finns några barn för föräldern:

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 bästa lösningen skulle dock vara att välja dina data så att de inkluderar en kolumn som innehåller hur många underordnade kategorier varje kategori har.

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

I vilken din funktion skulle vara:

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

Hoppas det hjälper?




  1. Konvertera Select-resultat till Insert script - SQL Server

  2. Hur man släpper en tabell i SQL

  3. Introduktion till Native Dynamic SQL i Oracle Database

  4. MySQL Duplicera rader