Mysql
 sql >> Base de données >  >> RDS >> Mysql

Arborescence du menu Echo avec fonction récursive

Que diriez-vous :

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

Cette fonction nécessite que vous interrogez d'abord votre base de données pour la liste complète des catégories disponibles et suppose que vos catégories racine ont une valeur nulle, mais la fonction peut être modifiée pour accepter -1 ou 0 selon le fonctionnement de votre schéma actuel.

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

Vous pouvez envisager de faire ce qui suit pour éviter que des UL vides n'apparaissent lorsqu'il n'existe aucun enfant pour le parent :

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

Cependant, la meilleure solution serait de sélectionner vos données pour inclure une colonne contenant le nombre de catégories enfants de chaque catégorie.

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

Dans laquelle votre fonction serait :

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

J'espère que ça aide ?