<?php
$expression = "5+4^3^2^1";
if (!preg_match('~^-?\d*\.?\d+([*/+-^]-?\d*\.?\d+)*$~', $expression)) {
echo "invalid expression";
} else {
$components = preg_split('~(?<=\d)([*/+-^])~', $expression, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
var_export($components); // ['5','+','4','^','3','^','2','^','1']
while (($index = array_search('^', $components)) !== false) {
array_splice($components, $index - 1, 3, pow($components[$index - 1], $components[$index + 1]));
var_export($components);
// ['5', '+', 64, '^', '2', '^', '1']
// ['5', '+' ,4096, '^', '1']
// ['5', '+', 4096]
}
while (($index = array_search('*', $components)) !== false) {
array_splice($components, $index - 1, 3, $components[$index - 1] * $components[$index + 1]);
var_export($components);
}
while (($index = array_search('/', $components)) !== false) {
array_splice($components, $index - 1, 3, $components[$index - 1] / $components[$index + 1]);
}
while (($index = array_search('+', $components)) !== false) {
array_splice($components, $index - 1, 3, $components[$index - 1] + $components[$index + 1]);
// [4101]
}
while (($index = array_search('-', $components)) !== false) {
array_splice($components, $index - 1, 3, $components[$index - 1] - $components[$index + 1]);
}
echo $components[0]; // 4101
}
preferences:
44.64 ms | 402 KiB | 5 Q