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

Menu cây xây dựng PHP / MySQL

Tôi thích giải pháp của @ mario và đã cải thiện nó với việc ngăn chặn <ul> dư thừa . Tôi chỉ khuyên bạn nên thực hiện ORDER BY trên truy vấn SQL của bạn để có menu theo thứ tự bạn muốn (thậm chí có thể đề xuất thêm cột trọng số / trình tự vào lược đồ.

Thiết lập dữ liệu:

$menu = array( // Presumed to have been coming from a SQL SELECT, populated for demo.
  array('id'=>1,'title'=>'Menu 1',          'parent_id'=>null),
  array('id'=>2,'title'=>'Sub 1.1',         'parent_id'=>1),
  array('id'=>3,'title'=>'Sub 1.2',         'parent_id'=>1),
  array('id'=>4,'title'=>'Sub 1.3',         'parent_id'=>1),
  array('id'=>5,'title'=>'Menu 2',          'parent_id'=>null),
  array('id'=>6,'title'=>'Sub 2.1',         'parent_id'=>5),
  array('id'=>7,'title'=>'Sub Sub 2.1.1',   'parent_id'=>6),
  array('id'=>8,'title'=>'Sub 2.2',         'parent_id'=>5),
  array('id'=>9,'title'=>'Menu 3',          'parent_id'=>null),
);

Xử lý:

function has_children($rows,$id) {
  foreach ($rows as $row) {
    if ($row['parent_id'] == $id)
      return true;
  }
  return false;
}
function build_menu($rows,$parent=0)
{  
  $result = "<ul>";
  foreach ($rows as $row)
  {
    if ($row['parent_id'] == $parent){
      $result.= "<li>{$row['title']}";
      if (has_children($rows,$row['id']))
        $result.= build_menu($rows,$row['id']);
      $result.= "</li>";
    }
  }
  $result.= "</ul>";

  return $result;
}
echo build_menu($menu);

Đầu ra:

<ul>
  <li>Menu 1<ul>
    <li>Sub 1.1</li>
    <li>Sub 1.2</li>
    <li>Sub 1.3</li>
  </ul></li>
  <li>Menu 2<ul>
    <li>Sub 2.1<ul>
      <li>Sub Sub 2.1.1</li>
    </ul></li>
    <li>Sub 2.2</li>
  </ul></li>
  <li>Menu 3</li>
</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. So sánh MySQL với giá trị null

  2. Ý nghĩa của dấu chấm hỏi trong MySQL tại cột WHERE là gì =??

  3. Nhận danh sách các ngày giữa hai ngày

  4. Làm cách nào để loại bỏ khoảng trắng đầu và cuối trong trường MySQL?

  5. Tại sao MySQL cho phép nhóm theo truy vấn KHÔNG có hàm tổng hợp?