Пытаюсь сделать калькулятор. Есть массив правил, в котором описано какая переменная должна быть <,>,=,!= итд какому то значению, например:
["sum",">","20"]
выражение составляет пользователь и что он туда пропишет неизвестно заранее. То есть может пояявится например:
["sum",">","20"]
["sum","!=","30"]
["sum","=>","777"]
а мне в свою очередь нужно взять этот массив и составить правило, по которому я должен искать значения, например:
if ($sum > 20){правило сработало, чтото делаем}
if ($sum != 30){правило сработало, чтото делаем}
if ($sum => 777){правило сработало, чтото делаем}
это вообще реально решить? У меня опыта не хватает :-)
Если делать в ООП стиле, то Вам необходимо описать новый тип данных, который будет представлять Ваши правила, как Вы их называете.
Например:
<?php
interface RuleInterface {
/**
*@return bool
*/
public function resolve();
}
И конкретные реализации этих правил, например:
Equal.php
<?php
class Equal implements RuleInterface {
private $a;
private $b;
public function __construct($a, $b)
{
$this->a = $a;
$this->b = $b;
}
public function resolve($a, $b)
{
return $a === $b;
}
}
GreaterThan.php
<?php
class GreaterThan implements RuleInterface {
private $a;
private $b;
public function __construct($a, $b)
{
$this->a = $a;
$this->b = $b;
}
public function resolve()
{
return $a > $b;
}
}
Потом Вам надо сделать фабрику, в которую Вы передавали бы результат ввода пользователя, а она бы Вам создавала на его основе правильный экземпляр типа RuleInterface, у которого Вы вызывали бы метод resolve()
и получали бы нужный результат.
Фабрика:
<?php
interface RulesFactory {
/**
*@param array $input
*@return RuleInterface
*/
public function createRule(array $input);
}
<?php
class SimpleRulesFactory implements RulesFactory {
public function createRule($array $input)
{
swith($input[1]) {
case '=' :
return new Equal($input[0], $input[2]);
case '>' :
return new GreaterThan($input[0], $input[2]);
default :
throw new Exception();
}
}
}
Пример:
<?php
$sum = 25;
$input = [
[$sum, '>', 20],
[$sum, '=', 25]
];
$factory = new SimpleRulesFactory();
foreach ($input as $row) {
$rule = $factory->create($row);
if ($rule->resolve()) {
// правило сработало, что-то делаем
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть форма, где динамический формируется поляПроблема в том что не работает валидация полей на клиентской части
Как вывести значение $username & $photos из функции в $dataToBePassed (сейчас выводит null):
Подскажите, допустим с помощью парсера получаю url картинки на сайте, с которого нужно скопировать картинкиИ нужно создать thumbnail для определённой...
На локальном хостинге использую denwer, пытаюсь создать папку с помощью функции mkdir(), ошибку не выдаёт но и ни чего не создаётМожет в php