<?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
}
- Output for 7.3.0 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.28, 8.2.0 - 8.2.18, 8.3.0 - 8.3.4, 8.3.6 - 8.3.7
- array (
0 => '5',
1 => '+',
2 => '4',
3 => '^',
4 => '3',
5 => '^',
6 => '2',
7 => '^',
8 => '1',
)array (
0 => '5',
1 => '+',
2 => 64,
3 => '^',
4 => '2',
5 => '^',
6 => '1',
)array (
0 => '5',
1 => '+',
2 => 4096,
3 => '^',
4 => '1',
)array (
0 => '5',
1 => '+',
2 => 4096,
)4101
- Output for 8.3.5
- Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
array (
0 => '5',
1 => '+',
2 => '4',
3 => '^',
4 => '3',
5 => '^',
6 => '2',
7 => '^',
8 => '1',
)array (
0 => '5',
1 => '+',
2 => 64,
3 => '^',
4 => '2',
5 => '^',
6 => '1',
)array (
0 => '5',
1 => '+',
2 => 4096,
3 => '^',
4 => '1',
)array (
0 => '5',
1 => '+',
2 => 4096,
)4101
preferences:
149.63 ms | 402 KiB | 157 Q