[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Подскажите какой вариант лучше
McLotos
Всем привет! =)
В БД лежит таблица
table
(`id`, `access`, `page`, `visibility`, `section`, `menu_name`, `parent`, `position`)
(1, 'all', 'all', 1, 'Head', 'Base', 'Kitchen', 0, 1),
(2, 'all', 'all', 1, 'Head', 'Base', 'Home', 0, 2),
(3, 'all', 'all', 1, 'Head', 'Base', 'Beauty', 0, 3),
(4, 'all', 'all', 1, 'Head', 'Base', 'Fitnes', 0, 4),
(5, 'all', 'all', 1, 'Left', 'Contacts', 'About', 0, 1),
(6, 'all', 'all', 1, 'Left', 'Contacts', 'Contacts', 0, 2),
(7, 'all', 'all', 1, 'Left', 'Contacts', 'Delivery', 0, 3);
(8, '!0', 'all', 1, 'Left', 'UserMenu', 'Messages', 0, 2),
(9, '!0', 'all', 1, 'Left', 'UserMenu', 'New', 9, 1),
(10, '!0', 'all', 1, 'Left', 'UserMenu', 'Inbox', 9, 2),
(11, '!0', 'all', 1, 'Left', 'UserMenu', 'Outbox', 9, 3),
(13, '!0', 'all', 1, 'Left', 'UserMenu', 'Settings', 9, 4);

делаю такой запрос
SELECT * 
FROM tvs_menu
WHERE `access`='all' OR `access`='!0' //авторизованный юзер
AND `page`='all' OR `page`='HomePage' //на главной странице
AND `visibility`='1' //только видимые пункты
ORDER BY 'parent','position'

если совсем грубо, то получаю массив
структура массива
[Секция][Имя меню][Номер позиции ссылки] = тут массив всех параметров ссылки
[Секция][Имя меню][Номер позиции ссылки] = тут массив всех параметров ссылки
[Секция][Имя меню][Номер позиции ссылки] = тут массив всех параметров ссылки

Внимание, вопрос! =)
Как лучше вытягивать подобную структуру? Так как сделал я, а потом просто циклом пробегаться и разбивать этот массив сначала секции, потом каждую секцию разбить на разные меню и потом уже формировать ссылки внутри массивов меню.
Или вариант 2
Послать в БД запрос и получить список секций.
Потом послать запрос и получить список меню в каждой из секций
И наконец послать ещё один запрос и получить список ссылок для каждого меню.
Или может кто предложит третий вариант? =)

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
McLotos
Т.е. тут выбор сейчас между Большим количеством кода, но всего 1 запрос к базе. либо несколько запросов, но кода почти не будет потому-что результат каждого запроса будет падать в свою переменную

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
FatCat
Когда запрос к 1 таблице, 1 запрос и обработка в цикле, по моему опыту, производительнее.

_____________
Бесплатному сыру в дырки не заглядывают...
McLotos
А то что при этом гора кода получается и несколько циклов для создания нескольких меню? Цикл тоже съедает очень много времени

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
FatCat
Цитата (SergeySA @ 3.07.2014 - 12:59)
несколько циклов для создания нескольких меню?

Рискну предположить, что всё можно собрать в одном цикле.
Как-то так:
$result = array();
while ( $r = $DB->fetch_row() )
{
$result[ $r['section'] ][ $r['menu_name'] ]['id']
$result[ $r['section'] ][ $r['menu_name'] ]['access']
$result[ $r['section'] ][ $r['menu_name'] ]['page']
$result[ $r['section'] ][ $r['menu_name'] ]['visibility']
// ...
}


_____________
Бесплатному сыру в дырки не заглядывают...
McLotos
Я сделал немного не так =)
$sql = "SELECT * 
FROM "
.MENU."
WHERE `access`={?}
OR `access`={?}
AND `page`={?}
OR `page`={?}
AND `visibility`={?}
ORDER BY {?},{?}"
;
$menuArray = $db -> select($sql,array('all',$_SESSION['access'],'all',$_SESSION['page'],'1','parent','position'));

получил весь массив меню. который нужен в конкретной ситуации
public function build_menu($arr) //этот метод вызывается снаружи
{
$this->split_menu($arr); //он делит отправляет массив дальше
$this -> menuArray; //сюда записывается результат работы скрытого метода
foreach ($this -> menuArray as $key => $value)
{$$key = $this -> menuArray[$key];} //так мы создаём отдельные массивы для каждой СЕКЦИИ Head,Left,Right,Foot
}

private function split_menu($arr) //этот метод делит массив полученный из БД
{
for($i=0;$i<count($arr);$i++)
{unset($arr[$i]['visibility']); //удаляем параметр видимости ссылок (он нам больше не нужен)
$menus[$arr[$i]['section']][$arr[$i]['menu_name']][$arr[$i]['position']] = $arr[$i];}
$this -> menuArray = $menus; //сохраняем в переменную класса
}

теперь у нас есть переменные $Head, $Left, $Right,$Foot в которые записаны все меню в формате
[меню1][ссылка1]
[меню1][ссылка2]
[меню2][ссылка1]
[меню2][ссылка2]
Т.е. в каждой из этих 4х переменных может лежать по несколько меню, а может и не быть вообще ни одного, тогда переменная не будет создана

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.