Mysql
 sql >> база данни >  >> RDS >> Mysql

Дърво на менюто Echo с рекурсивна функция

Какво ще кажете за:

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

Тази функция изисква първо да потърсите вашата база данни за целия списък с налични категории и да приемете, че вашите основни категории имат стойност null, но функцията може да бъде променена да приеме -1 или 0 в зависимост от това как работи текущата ви схема.

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

Може да помислите да направите следното, за да предотвратите появата на празни UL, когато не съществуват деца за родителя:

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

Най-доброто решение обаче би било да изберете данните си, за да включват колона, съдържаща колко дъщерни категории има всяка категория.

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

В която вашата функция ще бъде:

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

Надявам се това да помогне?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Множество вложки със ЗНП

  2. Добавете вътрешно присъединяване към mySQL GROUP_CONCAT израз

  3. android.content.res.Resources$NotFoundException:низ на ресурс с идентификатор #0x2 база данни

  4. Актуализирайте множество редове с множество клаузи „къде“ за всеки отделен ред

  5. Импортирайте база данни в MySQL или MariaDB