Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cây menu Echo với chức năng đệ quy

Làm thế nào về:

Hàm
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>';
}

Hàm này yêu cầu trước tiên bạn truy vấn cơ sở dữ liệu của mình cho toàn bộ danh sách các danh mục có sẵn và giả định rằng các danh mục gốc của bạn có giá trị null, nhưng hàm có thể được thay đổi thành chấp nhận -1 hoặc 0 tùy thuộc vào cách lược đồ hiện tại của bạn hoạt động.

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

Bạn có thể cân nhắc thực hiện những điều sau để ngăn chặn bất kỳ UL trống nào xuất hiện khi không có phần tử con nào tồn tại cho cha mẹ:

Hàm
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>';
}

Tuy nhiên, giải pháp tốt nhất là chọn dữ liệu của bạn để đưa vào một cột chứa bao nhiêu danh mục con mà mỗi danh mục có.

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

Trong đó chức năng của bạn sẽ là:

Hàm
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>';
}

Hy vọng điều đó sẽ hữu ích?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thiếu mysql.h và cố gắng tìm mysql-devel

  2. Tạo nếu một mục không tồn tại, nếu không, hãy cập nhật?

  3. Hình ảnh hiển thị PHP BLOB từ MySQL

  4. Thêm số 0 ở đầu vào một số giá trị trong cột trong MySQL

  5. MySQL - định kỳ ID tiếp theo / trước đó