Как ставить между двумя массивами неизвестный математический знак?

имеется такой код <?php echo $a + $b ?> выводится сложение. сейчас нужно сделать, что бы выводилось не +, а то, что есть в массиве $c. там может быть +, -, *, /.
как сделать так, что бы вместо знака + выводился неизвестный математический знак, он же $c ?
заранее спасибо!
  • Вопрос задан
  • 323 просмотра
Решения вопроса 2
Immortal_pony
@Immortal_pony Куратор тега PHP
function doAction($a, $b, $action) {
     switch ($action) {
          case "+": return $a + $b;
          case "-": return $a - $b;
          case "*": return $a * $b;
          case "/": return $a / $b;
          default: throw new \BadFunctionCallException("Unknown action");
    }
}

<?php echo doAction($a, $b, $c) ?>

Ну или использовать eval
Ответ написан
@smple
можно это сделать с помощью eval конечно, но такой способ я не рекомендую, вот так например
<?php
$a = 5;
$b = 6;
$c = '+';

echo eval("return $a $c $b;");

Более правильно сделать интерфейс OperationInterface и для каждого действия сделать свою реализацию (например OperationPlus, OperationMinux, OperationMultiply и тд)
Ну соответсвенно сделать выбор нужную реализацию, это по сути будет паттерн стратегия https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D...

Как еще один вариант можно просто сделать массив функций, которые будут принимать аргументом два параметра и делать операцию вот так:
<?php
$a = 5;
$b = 6;

$operation = [];
$operation['+'] = function ($a, $b) {
    return $a + $b;
};
$operation['*'] = function ($a, $b) {
    return $a * $b;
};
// тд на все варианты

$c = '+';
echo $operation[$c]($a, $b) . PHP_EOL;

$c = '*';
echo $operation[$c]($a, $b) . PHP_EOL;
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@McBernar
Хм ) Прикольный вопрос.
На ум пришла только функция со свитчем, как и у Immortal_pony.
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
https://wiki.php.net/rfc/operator-overloading
Через создание класса и перегрузки операторов!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы