![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 71 Всего: 315 |
вот такая вот задачка:
есть у нас функция, она принимает в себя значения формата, производит какие-то действия и наполняет результирующую строку данными, которые потом выдаёт. можно ли задать какие провести операции над этими данными? к примеру, есть функция, которая принимаетт такие аргументы:
внутри функции происходит выборка из БД, а затем подстановка данных, где %1\$d заменяется на $row['numb'], а %2\$s на $row['location']. итоговая строка выдаётся можно ли задать дополнительный ряд операций над получаемыми данными? то есть указать, что к примеру %1\$d равно $row['numb']*10/5, или просуммировать два других значения единственное, что придумывается - это указать аргументом имя другой функции /пользовательской/, в которую будут подставляться данные а нет ли более простого хода? Это сообщение отредактировал(а) bars80080 - 27.8.2009, 17:30 |
|||
|
||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
bars80080, я, если честно, не особо понял, что именно требуется от sprintf'а, но если он что-то не умеет (а что умеет, я думаю, сам знаешь где посмотреть), то я бы на твоем месте написал под свою задачу собственный парсер/логику. Если, разумеется, это не противоречит условиям задачи.
-------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 71 Всего: 315 |
парсер... может быть, но комбинации могут быть достаточно сложны.
к примеру, вывести первые 30 символов от строки данных писать парсер, который будет воспринимать пхп-шные функции, наверно слишком объёмно видимо, придётся кидать ссылку на пользовательскую функцию, в которой можно будет прописать необходимые действия и вернуть результат |
|||
|
||||
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: 10 Всего: 12 |
что то тут вроде...
Добавлено @ 18:15 или не оно? лямбда подойдет? Это сообщение отредактировал(а) NewDima - 27.8.2009, 18:21 |
|||
|
||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
bars80080, прости, туплю, видимо вечер сказывается. Тебе свой микроскриптовый язык нужен?
-------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
| Ипатьев |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2232 Регистрация: 5.7.2009 Репутация: 28 Всего: 37 |
скорее, парсер printf формата
я так понимаю, что его бы устроила функция, котора я "повыкусывала" бы из строки все printf-последовательности, и вернула их вместе с позициями. я думаю, такую вполне можно написать, как регом, так и перебором. главное, хорошую доку по форматам найти. возможно, кстати, в сети и есть уже готовый рег. |
|||
|
||||
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: 10 Всего: 12 |
Я видать неправильно понял задачу? Аргумент-массив - это типа домены таблицы базы данных, значение которых нужно узнать?
|
|||
|
||||
| Ипатьев |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2232 Регистрация: 5.7.2009 Репутация: 28 Всего: 37 |
нет, это похоже, я не до конца дочитал
похоже, да - скриптовый язык будет самое правильное определение. вот только не микро-, если там уже есть арифметика и строковые функции. осталось понять нафига козе такой тяжелый и неудобный баян... я бы порекомендовал смарти - там все заявленное уже есть. |
|||
|
||||
| bars80080 |
|
||||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 71 Всего: 315 |
что-то да
а при чём здесь смарти? и при чём вообще шаблонизатор? собирать ведь можно что-угодно мне не нужно, я спрашиваю о существующем решении. вот есть ведь такая система создания форматированной строки. хех знает, может быть есть и какие-то внутренние механизмы вычисления (кто там знает, сколько всякие библиотек и прочего написано) если решения нет, то понятное дело придётся писать самому NewDima, я думаю можно проще, без генерации внутренней функции, а просто указанием имени внешней Это сообщение отредактировал(а) bars80080 - 28.8.2009, 00:06 |
||||
|
|||||
| icewind |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 11.4.2009 Где: Ростов-на-Дону Репутация: 20 Всего: 20 |
Не думаю... Возможно функция create_function поможет в создании такого инструмента -------------------- ![]() |
|||
|
||||
| NewDima |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: 10 Всего: 12 |
icewind, когда что-то пишешь, смотри все сообщения =)
легко, но ты хотел без дополнительной функции |
||||
|
|||||
| Ипатьев |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2232 Регистрация: 5.7.2009 Репутация: 28 Всего: 37 |
||||
|
||||
| NewDima |
|
||||||||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: 10 Всего: 12 |
Уф, ну все, накатал. Только не пинайте))
В общем я тут подумал, пописал. И вот что накатал: Три класса (наследование): парсер->функционал->внешние данные В парсере определил сам метод разбиения строки, метод вызова вычисления, который в свою очередь вызывает пользовательские методы из класса "функционал". Класс функционал реализует несколько необязательных функций, которые работают над данными (сложение чисел, умножение, возведение в квадрат, в общем что дуща пожелает). Последний класс, который работает с внешними данными (собственно как bars80080 говорил про данные, которые вытаскиваются из базы) и представляет их абстракному классу предку парсеру. У парсера два публичных метода: public function parseValues($str, $values) принимает строку форматирования и значения в массиве $values. Значения имею специфический формат, но простой, я пытался проще придумать. Формат значения: 1. если строка, то подразумевается, что эта строка может являеться глобальным ключом, к которому можно обращаться из любого места массива, потом покажу как. В противном случае, по абстрактному методу определяется, есть ли по данному ключу чтонибудь в данных (например из базы), елси есть, то вставляется оттуда. Если нигде не определено значение ключа, то значением является сам ключ. 2. если массив, то в массиве должен быть определен ключ '#opcode#', значение которого - операция, которую нужно совершить над остальными элеменати массива и вернуть. Если опкод не определен, то выбрасывается исключение. 3. если любой другой тип, то он возвращается сам. public function toggleDebug() включает или выключает дебаг (там видно сразу, как работает парсер), по умолчанию дебаг отключен. Имя класса - stringParser, абстрактный. Класс функционала не имеет публичных функций, реализует защищенные функции, имя которых начинается с двух прочерков, а далее идет опкод команды (тот самый, который определен в массивах). Имя класса - extendedParser, абстрактный. Класс данных собственно предназначен для того, чтобы брать данные из определенныйх мест, например из базы данных. Обязан реализовать две защищенные функции: _isInternalKey($key) По ключу определяет, имеются ли данные для этого ключа _internalKeyValue($key) Возвращает ассоциированные с ключом данные. Опишу "функции" записывается примерно так:
Функции поддерживают вложенность:
Приведу код класса stringParser
Класс extendedParser (его можно реализовать так, как надо, добавлять нужные функции, убирать ненужные, очень легко)
Класс dbXParse (он у меня практически пустой, н там все ясно)
для примера я составил парсинг вот таких функций:
Пример массива для этих всех функций со всеми параметрами
Шаблон для вывода думаю вставлять не стоит, и так много текста, но он такого же формата, как и у bars80080 Использование:
вывод:
Вот такой вот прикол Добавлено через 6 минут и 48 секунд ой, там 4=2 =) это я в шаблоне ошибся) Добавлено через 13 минут и 32 секунды Тут исходник, на всякий случай)) Присоединённый файл ( Кол-во скачиваний: 2 )
buka.rar 4,32 Kb |
||||||||||||||||||
|
|||||||||||||||||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 71 Всего: 315 |
спасибо, будем ковырять
|
|||
|
||||
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: 10 Всего: 12 |
главное, чтобы в помощь)
|
|||
|
||||
![]()
|
| Правила форума "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. |