[PHP] Категории и подкатегории - сортировка

Discussion in 'PHP' started by Kandi, 24 Feb 2014.

  1. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Всем привет, не могу догнать как сортировать категории и подкатегории. Имею таблицу в БД (id, parent_id, name). Нужно выводить категорию, а под ней все подкатегории. Может быть реально на уровне MySQL? Помогите или поделитесь алгоритмом плиз. Заранее благодарю.
     
  2. Stronger

    Stronger Member

    Joined:
    26 Dec 2010
    Messages:
    54
    Likes Received:
    7
    Reputations:
    2
    sql
    PHP:
    CREATE TABLE `tree` (
      `
    idINT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
      `
    parentINT NOT NULL ,
      `
    titleVARCHAR(255NOT NULL,
      ...
    );
    PHP:
    function &LoadTree$table ){
      
    // загружаем данные из базы во вспомогательный массив $raw, в котором индексом будут id вершин дерева
      
    $sqlresult =  mysql_query'SELECT * FROM `'.$table.'`' );
      
    $raw = array();
      while( 
    $item mysql_fetch_assoc$sqlresult ) ){
        
    $item['subitems'] = array();
        
    $raw$item['id'] ] = $item;
        }
      
    // строим само дерево
      
    $tree = array();
      foreach( 
    $raw as $id=>&$item )
        if( 
    array_key_exists$item['parent'], $raw )  )  // если есть родительская вершина в дереве
          
    $raw$item['parent'] ]['subitems'][ $id ] =& $item;
        else 
    // иначе - это вершина верхнего уровня
          
    $tree$id ] =& $item;
      
    // дерево построенно, возвращаем его из ф-ии
      
    return $tree;
      }
    PHP:
    function ShowTree( &$tree ){
      echo 
    '<ul>';
      foreach( 
    $tree as &$item ){
        echo 
    '<li>'.$item['title'];
        if( ! empty(
    $item['subitems']) )
          
    ShowTree$item['subitems'] );
        echo 
    '</li>';
        }
      echo 
    '</ul>';
      }
     
    $tree =& LoadTree'table_name' );
    ...
    ShowTree$tree );
     
    1 person likes this.