Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Misha v.3 12.03.2011 02:17 / 12.03.2011 02:22
ваша задача всё равно не является той задачей, для которой действительно требуется применение хэша. попробую проиллюстрировать его использование на задаче вывода сообщения с тэгами.$hMessageToTag[ $.1[ $.5(1) $.10(1) $.15(1) ] $.2[ $.5(1) $.6(1) ] ... ]тут ключ первого уровня -- message_id, ключ второго -- tag_id. значение -- просто чтоб было (можно с пустыми значениями, но тогда проверка ниже будет немного другой).
^tMessage.menu{ <p>$tMessage.content</p> ^tTag.menu{^if($hMessageToTag.[$tMessage.id].[$tTag.id]){<span>$tTag.name</span>}}[, ] }кстати подобную структуру в хэше бывает очень неудобно получать на основе данных, которые достаются из БД, поэтому иногда структуру хеша делают иной (с составным ключом):
$hMessageToTag[ $.1=5(1) $.1=10(1) $.1=15(1) $.2=5(1) $.2=6(1) ... ]тут первая часть ключа (до разделителя, который я выбрал в виде символа '=') -- message_id, вторая часть -- tag_id.
$hMessageToTag[^tMessageToTag.hash{$tMessageToTag.message_id=$tMessageToTag.tag_id}]код проверки наличия у сообщения определённого тэга меняется на следующий:
^if($hMessageToTag.[$tMessage.id=$tTag.id]){...}но приведённый выше подход в общем случае плох. проблема в том, что у нас есть вложенный цикл с проверкой. если тэгов существенно больше, чем привязок, то внутренний цикл будет крутиться вхолостую, поэтому для устранения повторяющегося внутреннего холостого цикла лучше сделать хэш таблиц с ключами message_id, а структуру с тэгами перевести в хэш (или сразу доставать из БД как хэш):
$hMessageTags[^tMessageToTag.hash[message_id][$.type[table] $.distinct(true)]] $hTag[^tTag.hash[tag_id]] ^tMessage.menu{ <p>$tMessage.content</p> ^if($hMessageTags.[$tMessage.id]){ ^hMessageTags.[$tMessage.id].menu{ <span>$hTag.[$hMessageTags.[$tMessage.id].tag_id].name</span> }[, ] } }в $hMessageTags будет следующая структура (ключами являются message_id, а значениями -- таблицы):
$hMessageTags[ $.1[^table::create{message_id tag_id 1 5 1 10 1 15}] $.2[^table::create{message_id tag_id 2 5 2 6}] ]P.S. приводимый код я не проверял и в нём возможны синтаксические или иные ошибки.