Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Drzewo menu Echo z funkcją rekurencyjną

A co powiesz na:

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

Ta funkcja wymaga, abyś najpierw przesłał zapytanie do bazy danych o całą listę dostępnych kategorii i zakłada, że ​​kategorie główne mają wartość null, ale funkcję można zmienić tak, aby akceptowała -1 lub 0, w zależności od tego, jak działa bieżący schemat.

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

Możesz rozważyć wykonanie następujących czynności, aby zapobiec pojawianiu się pustych UL, gdy dla rodzica nie ma dzieci:

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

Jednak najlepszym rozwiązaniem byłoby wybranie danych tak, aby zawierały kolumnę zawierającą liczbę kategorii podrzędnych w każdej kategorii.

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

W jakiej funkcji byłoby:

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

Mam nadzieję, że to pomoże?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie MySQL, aby znaleźć znajomych i liczbę wspólnych znajomych

  2. Nie znaleziono metody w klasie

  3. Czy usunięcie tabeli w MySQL powoduje również usunięcie indeksów?

  4. Wstaw listę do mojej bazy danych za pomocą Pythona

  5. jak wybrać max mieszanej kolumny ciąg/int?