За последние 24 часа нас посетили 17255 программистов и 1619 роботов. Сейчас ищут 974 программиста ...

Оптимизация кода

Тема в разделе "PHP для новичков", создана пользователем Assessor, 28 сен 2008.

  1. Assessor

    Assessor Активный пользователь

    С нами с:
    21 авг 2007
    Сообщения:
    21
    Симпатии:
    0
    Адрес:
    Пермь
    Добрый день.
    С точки зрения работоспособности работает на ура, строит правильные списки <ul><li>, нареканий нет, но такое ощущение, что я перемудрил, и есть гораздо проще решение, поэтому прошу взглянуть трезвым взглядом. Во первых не нравиться запрос в цикле, он и больше всех и раздражает.... Во вторых, просто не нравиться, громоздко слишком.

    Таблицы
    // NESTED SETS (категории)
    | id | parent_id | name | tree_left | tree_right | tree_level |
    // Страницы
    | id | cat_id | name | sort |

    PHP:
    1. <?php
    2. // Сама функция построения списков
    3. function ISMmenu()
    4. {
    5.     global $dbInit, $settings_table;
    6.  
    7.     $retMenu    = '';
    8.     $menu       = '';
    9.  
    10.     // Считываем какое меню у нас установлено
    11.     $query_menu = "
    12.             SELECT pos_menu
    13.                 FROM " . $settings_table['settings_menu'] . "
    14.                 ORDER BY    id
    15.                 LIMIT       1
    16.                 ";
    17.     if ($row_menu = $dbInit -> get_row($query_menu))
    18.     {
    19.         $current_level = 0;
    20.  
    21.         $pos_menu       = $row_menu -> pos_menu;
    22.  
    23.         $query_cat = "
    24.                 SELECT *
    25.                     FROM " . $settings_table['page_cat'] . "
    26.                     ORDER BY        parent_id, tree_left
    27.                     ";
    28.         if ($rows_pageCat = $dbInit -> get_results($query_cat))
    29.         {
    30.             $retMenu .= '<ul id = "navDropTopMenu">';
    31.  
    32.             foreach ($rows_pageCat as $row_pageCat)
    33.             {
    34.                 $cat_id     = intval($row_pageCat -> id);
    35.                 $cat_name   = '<a href = "">' . htmlspecialchars_decode($row_pageCat -> name) . '&nbsp;»</a>';
    36.                 $tree_left  = intval($row_pageCat -> tree_left);
    37.                 $tree_right = intval($row_pageCat -> tree_right);
    38.                 $tree_level = intval($row_pageCat -> tree_level);
    39.  
    40.                 if ($tree_level === $current_level)
    41.                 {
    42.                     $retMenu .= '<li>' . $cat_name;
    43.                 }
    44.                 else if ($tree_level > $current_level)
    45.                 {
    46.                     $retMenu .= '<ul><li>' . $cat_name;
    47.                     $current_level++;
    48.                 }
    49.  
    50.  
    51.                 $query_page = "
    52.                         SELECT id, link, name
    53.                             FROM " . $settings_table['pages'] . "
    54.                             WHERE       approved        = 'Yes'
    55.                             AND         cat_id          = " . $cat_id . "
    56.                             ORDER BY    sort
    57.                             ";
    58.                 if ($rows_page = $dbInit -> get_results($query_page))
    59.                 {
    60.                     if ($tree_level === $current_level)
    61.                     {
    62.                         $retMenu .= '<ul>';
    63.                     }
    64.  
    65.                     foreach ($rows_page as $row_page)
    66.                     {
    67.                         $id         = intval($row_page -> id);
    68.                         $name       = htmlspecialchars_decode($row_page -> name);
    69.  
    70.                         if ($tree_level < $current_level)
    71.                         {
    72.                             $menu = '<ul><li><a href = "#">' . $name . '</a></li></ul>';
    73.                         }
    74.                         else
    75.                         {
    76.                             $retMenu .= '<li><a href = "#">' . $name . '</a></li>';
    77.                         }
    78.                     }
    79.  
    80.                     if ($tree_level === $current_level)
    81.                     {
    82.                         $retMenu .= '</ul>';
    83.                     }
    84.                 }
    85.  
    86.                 if ($tree_level === $current_level && $tree_right - $tree_left === 1)
    87.                 {
    88.                     $retMenu .= '</li>';
    89.                 }
    90.                 else if ($tree_level < $current_level)
    91.                 {
    92.                     $retMenu .= '</ul></li><li>' . $cat_name . $menu . '</li>';
    93.                     $current_level--;
    94.                 }
    95.             }
    96.  
    97.             $retMenu .= '</ul>';
    98.         }
    99.     }
    100.     else
    101.     {
    102.         return LANG_ERROR_NOMENUPOS;
    103.     }
    104.  
    105.     return $retMenu;
    106. }
    107.  
     
  2. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    мда, для начала можно убрать половину лишних пустых строк, кода убудет в 2 раза
    запрос в цикле это плохо, значит либо БД неправельно спроектирована, либо нужно где применить объединение таблиц (скорее всего LEFT JOIN), либо кешировать какие-то таблицы, у меня например кешируются категории...
    Чтобы можно было написать больше, неплохо было бы хорошо прокоментировать код...