sql >> Databáze >  >> RDS >> Mysql

Echo strom menu s rekurzivní funkcí

Co třeba:

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

Tato funkce vyžaduje, abyste se nejprve dotázali své databáze na celý seznam dostupných kategorií a předpokládá, že vaše kořenové kategorie mají hodnotu null, ale funkci lze změnit tak, aby akceptovala -1 nebo 0 v závislosti na tom, jak vaše aktuální schéma funguje.

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

Můžete zvážit provedení následujícího, abyste zabránili tomu, aby se objevily prázdné UL, když pro rodiče neexistují žádné potomky:

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

Nejlepším řešením by však bylo vybrat data tak, aby obsahovala sloupec obsahující počet podřízených kategorií v každé kategorii.

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

Ve které by vaše funkce byla:

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

Doufám, že to pomůže?




  1. Počet Počet po sobě jdoucích výskytů hodnot v tabulce

  2. python 3.5 - django 1.10 - chyba instalace mysqlclient windows 7

  3. Proč se přeruší konektor mysql (ztracené připojení k serveru MySQL během chyby dotazu)

  4. mysqldump přes SSH do místního počítače