3v4l.org

run code in 300+ PHP versions simultaneously
<?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