Я пытаюсь создать функцию, которая принимает строку (содержащую простое математическое выражение), а затем разбивает каждую из частей на массив.
Например, ввод 2 + 3 * 7 или 2 – 5 / 3.4, вывод должен быть как ["2", "+", "3", "*", "7"] и ["2", "-", "5", "/", "3.4"]
Вот мои коды:
$input = "2 + 3 * 7";
$input = "2-5/3.4";
function splitExpression($string) {
$result = explode (" ", $input);
print_r ($result);
}
Используя только взрыв, конечно, 1-й пример работает хорошо, но не то же самое с другим.






Вы можете использовать для этого str_split(). Нравиться
str_split($str1);
$input = "2-5/3.4";
$input = "2 + 3 * 7";
function splitExpression($string) {
//$result = str_split (string);
$result = str_split (preg_replace('/\s+/', '', $string));
return $result;
}
$arr1 = splitExpression($input);
Где preg_replace('/\s+/', '', $string) используется для удаления пробелов из строки.
Что, если строка 30 + 4 *2? Или 40+3.4? Или первый из $input? Это не работает. Это будет работать только тогда, когда есть целые числа, нет десятичных знаков и нет числа больше 9. Довольно сильное ограничение.
вы можете использовать регулярное выражение:
$matches = array();
$input = "2 + 3 * 7 / 5 - 3";
preg_match_all("/\d+|[\\+\\-\/\\*]/",$input,$matches);
это регулярное выражение ищет число или оператор и помещает совпадения в $matches. можно редактировать оформление массива совпадений по флажкам.
matches:
+ 0
- 0 : 2
- 1 : +
- 2 : 3
- 3 : *
- 4 : 7
- 5 : /
- 6 : 5
- 7 : -
- 8 : 3
Это регулярное выражение недопустимо.
Можно попробовать так - на основе ответа в другом месте стека. Изменил шаблон и добавил preg_replace, чтобы на результаты не влияли пробелы во входной строке.
$input = '2 + 3 * 7';
$input = '2-5/3.4';
$pttn='@([-/+\*])@';
$out=preg_split( $pttn, preg_replace( '@\s@', '', $input ), -1, PREG_SPLIT_DELIM_CAPTURE );
printf('<pre>%s</pre>',print_r( $out, true ) );
Выведет:
Array
(
[0] => 2
[1] => -
[2] => 5
[3] => /
[4] => 3.4
)
Обновлять:
$input = '2 + 5 - 4 / 2.6';
$pttn='+-/*'; # standard mathematical operators
$pttn=sprintf( '@([%s])@', preg_quote( $pttn ) ); # an escaped/quoted pattern
$out=preg_split( $pttn, preg_replace( '@\s@', '', $input ), -1, PREG_SPLIT_DELIM_CAPTURE );
printf('<pre>%s</pre>',print_r( $out, true ) );
выходы:
Array
(
[0] => 2
[1] => +
[2] => 5
[3] => -
[4] => 4
[5] => /
[6] => 2.6
)
вы имеете в виду как в правиле "BODMAS"?
нет, я не верю, что это произойдет, но тогда это не было частью вопроса и, по сути, потребовало бы совершенно нового вопроса.
Вышеупомянутый вопрос не решается вашим ответом, потому что сначала он вычисляет 2-5, а затем деление...
взгляните на вопрос - особенно "The output should be like ....."
@RamRaider, не могли бы вы рассказать мне больше о $pttn='@([-/+\*])@'; как ограничителе? Потому что, когда я меняю/переупорядочиваю его, меняется вывод.
Я думаю, что изначально, когда я писал, что мне повезло в первый раз, так как когда я изменил порядок, он выдал ошибки, а не другой порядок - из-за того, что я уверен, что не убегу от определенных элементов в шаблоне. Я добавлю измененный фрагмент выше, который правильно экранирует математические операторы.
Возможный дубликат Пытаюсь разбить строку на 3 переменные, но немного сложнее - PHP