Дано: Имеем огромную таблицу (неважно как и откуда сформированную) с большим количеством как строк, так и столбцов. Хочется строить графики на основании данных из этой таблицы, причем не просто по каким либо столбцам, а чтобы пользователь мог ВВЕСТИ ФОРМУЛУ, по которой будут вычисляться значения каждой конкретной точки. Графики уже рисуются, выборка тоже более-менее делается. А вот как вводить формулы у меня только смутные представления. Вроде какая-то функция делает подстановку текстововй строки с переменными, но я что-то не могу найти какая именно. Я прошу: на данный момент идею в общем виде. Ни разу не жду готовый скрипт, просто скажите как оно примерно делается.
путем некоторых извращений пришел к такому коду: Код (PHP): class Equation { private static $functions = array( 'cos' => '!01!', 'sin' => '!02!', 'floor' => '!03!' ); /** * * @param string $formula * @param array $vars - Тут ключи это переменные, а значения - значения. * @return boolean */ public static function Parse($formula, $vars) { //lets keep original formula for debug and error reports $eq = $formula; //this is what function will return $r = false; //Мы заменим функции на такие вот выражения с восклицательным знаком. А потом проверим, и заменим обратно. $eq = str_replace(array_keys($vars), $vars, $eq); $eq = str_replace(array_keys(self::$functions), self::$functions, $eq); if (preg_match('/^[\d!\+\-\*\/\(\)\s\\.]+$/', $eq)) { $eq = str_replace(self::$functions, array_keys(self::$functions), $eq); eval('$r = ' . $eq . ';'); } return $r; } } в формуле 1) известные функции из $functions подменяются на конструкицю типа !число! 2) Ключи из $vars заменяются значениями из $vars 3) и потом проверяется, если в строке есть только разрешенные символы, то конструкции подменяются обратно на функции и строка идет в Eval работает так: Код (PHP): $i = Equation::Parse('cos(Писька + пиписька)/2', array('Писька'=>10, 'пиписька'=>100));
Огромное спасибо, Игорь, пробую разобраться. --------- Так пока и не разобрался, но оно работает. Мне очень стыдно..
Вроде все понятно, но я пока еще совсем плохо классы знаю. И надо как-то все это великолепие в общую структуру вживлять (ничего сложного, но требует времени) Через пару дней постараюсь выложить мои вариации на тему подготовки данных и рисование по ним графиков.
да тут не класс, а так, просто функция считай. это я для удобства в статик засунул. можно вытащить. Код (PHP): function Parse($formula, $vars) { //lets keep original formula for debug and error reports $functions = array( 'cos' => '!01!', 'sin' => '!02!', 'floor' => '!03!' ); $eq = $formula; //this is what function will return $r = false; //Мы заменим функции на такие вот выражения с восклицательным знаком. А потом проверим, и заменим обратно. $eq = str_replace(array_keys($vars), $vars, $eq); $eq = str_replace(array_keys($functions), $functions, $eq); if (preg_match('/^[\d!\+\-\*\/\(\)\s\\.]+$/', $eq)) { $eq = str_replace($functions, array_keys($functions), $eq); eval('$r = ' . $eq . ';'); } return $r; }