![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Преамбула:
В некоем магазине периодически-нерегулярно возникают разные акции для каких - то товаров. Примеры акции -
Сами эти акции, в общем, довольно сложно формализуемы (очень много разных правил, в админку выводить сильно лень), и они кодятся прямо в отдельном классе, в PHP. Амбула: Возникла проблема с компактным и легкопонимаемым способом указания списка категорий. Пока остановился на таком - строка с числами, в конце которых может быть знак + или -.
В этой записи, товар ($item) проверяет, что его категория является подкатегорией 501 или 172 категории, либо точно совпадает с 128 и точно не является подкатегорией 201. Парсинг такой строки выглядит тоже довольно компактно
Пока возможностей, вроде хватает, но терзают сомнения, что логики в строковом представлении как-нибудь не хватит. Сталкивался ли кто-нибудь с чем-то похожим? Возможно, с бОльшей логикой в записи? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
||||
|
|||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
такое не пройдет:
"категория товара не является подкатегорией категории С" "скидка (не)предоставляется, если товар входит в категории A и B одновременно" для реализации буйной фантазии нужны явные И, ИЛИ, НЕ и синтаксис, однозначно определяющий категорию и подкатегории. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Ok. Предлагается такой синтаксис `[&|]?{категория}[+-.]?`. Логика обработки правил сейчас такова, что по ИЛИ собираются все условия на "является категорией" или "является подкатегорией" и по И "не является подкатегорией". Тоесть, для каждого из первых 2-х условий "знак по уможчанию" - `|` - его можно опустить. Для "не является подкатегорией" - знак &. При желании - знак логической операции можно поменять. `&501+ &172+` - знак & гарантирует, что товар находится и в подкатегории 501 и в 172. Для полноты нужно бы порассуждать, может ли что-нибудь содержательное обозначать запись `|127-`... Вероятно, какая-то ненужная фигня... Запись `127.` означает ИЛИ категория 127 И не подкатегория 127. Блин... что-то сложно. В принципе - скобочную структуру можно заменить массивом правил. Правило подходит, если подходит хотя бы одно из его правил... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
||||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
FIQL - забавная штука, надо будет посмотреть
Ok, вариант. Хотя, если смотреть на дерево синтаксиса - AND выполнится раньше, чем OR и получится логически не то, что мне надо. Без скобок, как надо, записать не получится -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
||||
|
||||
| ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Решил отряхнуть пыль с ушей и состряпать свой собственный парсер, с обратной польской записью и калькулятором...
Тынц Синтаксис получившегося языка, примерно вот такой 128 or 512* and not 201* или такой, он парсится в такую же конструкцию 128 512* not 201* Основу составляет класс для компиляции в обратную польскую форму, которому для счастья нужно установить список операций с приоритетами, операции-суфиксы-унарные, и колбяки, которые и выполняют все эти операции. Вот так, например, на нем выглядит калькулятор
Операция ++ здесь просто выдает значение на единицу больше.
Это сообщение отредактировал(а) ksnk - 9.6.2015, 11:35 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
||||
|
|||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |