Не считывается символ + из файла php.

176
14 июля 2018, 11:20

есть задача. Исходные два числа хранятся в текстовом файле в произвольной последовательности. По нажатию кнопки Вычислить результат выводится в форму. Проблема в том, что из файла получается считать только числа, но сложить их нельзя. Пыталась считать файлы посимвольно и если один из элементов равен плюсу, то остальные числа сложить, но ничего не получилось. Прошу помощи, т.к. в php еще новичок.

]2

 <?php
function getPlus($a, $b){
    return $a+$b;
}
function getMinus($a, $b){
    return $a-$b;
}
function plus(){
    $db = mysql_connect("localhost","root","") or die ("don't connect with mysql");
     mysql_select_db("exam",$db) or die ("don't connect with db");
     $file = 'data.txt';
     $f = fopen($file,"r") or "don't open file";
     $a = Array();
     while (($data = fgets($f))!=false){
         $a0 = explode(" ",$data);
         foreach ($a0 as $item)
            if (is_numeric(trim($item)))
                $a[] = $item;
     }
     fclose($f);
foreach($a as $item) echo $item;
$char = '+';
     // $res = 0;
for ($i = 0; $i < 3; $i++){
    if ()
    {$res = $a[1]+$a[2];}
}
echo $res;
}
if (isset($_GET['button'])){
    plus();
}
Answer 1

Можно воспользоваться функцией rsort и eval

$file = file('file.txt');

Обозначим допустимые математические знаки

$exp = ['+', '-', '/', '*'];

Далее сортируем массив

rsort($file); 

Делаем проверку допустимого знака, если такой есть, то выполняется дейтсвие

if (in_array($file[2], $exp)) {
    echo eval('return $file[0] '.$file[2].' $file[1];'); 
}
Answer 2

есть много вариантов

<?php
 $file = file('file.txt', FILE_SKIP_EMPTY_LINES); // читаем фаил в массив
 $file = array_map('trim', $file); // тримим
 $plus = array_search('+', $file); // ищем плюс
 $result = 0;
 if($plus !== false) { // если нашли
     unset($file[$plus]); //убираем его с массива 
     $result = array_sum($file); // суммируем массив
     echo $result . ' ok';
 } else {
     echo 'error';
 }
Answer 3
<?php
$trimmed = file('sum_nums.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$stack = [];
$op = '';
// Expression that can be calculated
$expr = ['+', '-', '/', '*'];
foreach($trimmed as $line_num => $line){
    // 
    if(in_array($line, $expr)){
        $op = $line;
    }else{// Numbers
        $stack[] = (int)$line;
    }
    // Calculate 
    if(count($stack) == 2 && !empty($op)){
       echo sprintf("%d %s %d = %d", $stack[0] , $op , $stack[1] ,eval('return ' .$stack[0] .$op. $stack[1] . ';')) . "\n";
        // Empty array and operation
        $stack = [];
        $op = '';
    }
}
Answer 4

Ну как вариант :<

$FILE = 'data.txt';
$ARRAY = array_filter(file($FILE), function($value) {
    return !empty(trim($value));
});
$RESPONSE = NULL;
foreach ($ARRAY as $key => $value) {
    if (($value == '+') OR ($value == '-')) {
        unset($ARRAY[$key]);
        foreach ($ARRAY as $value2) {
            if (is_numeric($value2)) {
                switch ($value) {
                    case '+':
                        if (is_null($RESPONSE)) {
                            $RESPONSE = 0;
                        }
                        $RESPONSE += $value2;
                        break;
                    case '-':
                        if (is_null($RESPONSE)) {
                            $RESPONSE = $value2;
                        }
                        $RESPONSE -= $value2;
                        break;
                    default:
                        break;
                }
            }
        }
        break;
    }
}
var_dump($RESPONSE);

А если просто сложить, то так:

$FILE = 'data.txt';
$ARRAY = array_filter(file($FILE), function($value) {
    return !empty(trim($value));
});
$RESPONSE = 0;
foreach ($ARRAY as $key => $value) {
    if ($value == '+') {
        unset($ARRAY[$key]);
        foreach ($ARRAY as $value2) {
            if (is_numeric($value2)) {
                $RESPONSE += $value2;
            }
        }
        break;
    }
}
var_dump($RESPONSE);
READ ALSO
Включение исходных файлов в Cmake

Включение исходных файлов в Cmake

не так давно пользуюсь CMake и вот наткнулся на такую, нельзя сказать проблему, а скорее не понятную мне вещь, пример:

183
Забрать move семантикой строку из stringstream

Забрать move семантикой строку из stringstream

Чтобы сформировать строку использую std::stringstream (набиваю содержимым оператором <<), затем выбираю полученную строку методом std::stringstream::str:

182
Кастомизация консольного приложения в Linux

Кастомизация консольного приложения в Linux

Пишу консольное приложение в Linux, вот и возникло два вопроса

171
с++ и виртуальное наследование

с++ и виртуальное наследование

Необходимо создать базовый класс который будет иметь 4 наследникаВся проблема в том, что мне нужен базовый класс в одном экземпляре, так как...

283