Аватар для Майкл Скоуфилд
11 / 10 / 3
Регистрация: 25.09.2015
Сообщений: 238

Как в переменную поместить знак умножения и использовать в дальнейшем

04.01.2021, 17:16. Показов 4731. Ответов 22

Студворк — интернет-сервис помощи студентам
Нужно сделать простой перебор элементов массива и проводить с ними математические действия указанные в переменной $math.
При обработке кода выдаёт результат строкой, то есть знак * не считается как знак умножения, а просто символ.
Как добиться что значение переменной $math работало как знак умножения а не строка

PHP
1
2
3
4
5
6
7
8
9
10
11
    
 
    $numbers = array(1,2,3,4,5);
    $math = "*";
 
    function square($numbers, $math){
        for ($i = 0; $i < count($numbers); $i++){
            echo $numbers[$i].$math.$numbers[$i]."<br>";
        }
    }
    square($numbers, $math);
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.01.2021, 17:16
Ответы с готовыми решениями:

В аргументах командой строки указать переменную, чтобы использовать ее в дальнейшем
Доброго времени суток. Никак не могу понять, как сделать так, чтобы в аргументах командой строки указать переменную, чтобы...

Как сохранять информацию о пользователе и использовать её в дальнейшем уведомлении?
Форумчане, позвольте спросить: как сохранять имя и фамилию пользователя и использовать их в уведомлении? Ранее Java не занимался...

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

22
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
04.01.2021, 17:26
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
interface MathOperation
{
    public function __toString(): string;
    public function __invoke($a, $b);
}
 
$numbers = array(1,2,3,4,5);
$multiply = new class implements MathOperation {
    public function __toString(): string
    {
        return '*';
    }
    public function __invoke($a, $b)
    {
        return $a * $b;
    }
};
 
$nl = '<br>';
foreach ($numbers as $n) {
    printf('%d %s %d = %d%s', $n, $multiply, $n, $multiply($n, $n), $nl);
}
0
 Аватар для Майкл Скоуфилд
11 / 10 / 3
Регистрация: 25.09.2015
Сообщений: 238
04.01.2021, 17:31  [ТС]
Не подойдёт. Класс мы ещё не проходили =)
Прошли только переменные, массивы, циклы, функции.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
04.01.2021, 17:33
Цитата Сообщение от Майкл Скоуфилд Посмотреть сообщение
Прошли только переменные, массивы, циклы, функции.
Ну используй функцию вместо класса.
0
 Аватар для Майкл Скоуфилд
11 / 10 / 3
Регистрация: 25.09.2015
Сообщений: 238
04.01.2021, 17:49  [ТС]
Для понимания добавлю условия задачи.

Функция, принимающая два параметра - массив чисел и строку, обозначающее арифметическое действие, которое нужно выполнить со всеми элементами массива. Функция должная выводить результат на экран.

Может я что-то не правильно понимаю но я понял так - передаём в функцию массив чисел и переменную которая содержит знак арифметического действия.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
04.01.2021, 17:54
Цитата Сообщение от Майкл Скоуфилд Посмотреть сообщение
Может я что-то не правильно понимаю но я понял так - передаём в строку массив чисел и переменную которая содержит знак арифметического действия.
PHP
1
2
3
4
5
6
7
8
9
function blah_blah_blah(array $numbers, string $operator) {
    static $operators = [
        '*' => fn ($a, $b) => $a * $b,
    ];
    $f = $operators[$operator];
    foreach ($numbers as $n) {
        echo $f($n, $n), '<br>';
    }
}
0
 Аватар для Майкл Скоуфилд
11 / 10 / 3
Регистрация: 25.09.2015
Сообщений: 238
04.01.2021, 18:04  [ТС]
Constant expression contains invalid operations in line 5


PHP
1
2
3
4
5
6
7
8
9
10
11
 $numbers = array(1,2,3,4,5);
    $operator = "*";
 
function blah_blah_blah(array $numbers, string $operator) {
    static $operators = ['*' => fn ($a, $b) => $a * $b,];
    $f = $operators[$operator];
    foreach ($numbers as $n) {
        echo $f($n, $n), '<br>';
    }
}
    blah_blah_blah($numbers, $operator);
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
04.01.2021, 18:09
Цитата Сообщение от Майкл Скоуфилд Посмотреть сообщение
Constant expression contains invalid operations in line 5
static убрать. И на всякий случай, этот код для php 7.4 и выше
0
 Аватар для Майкл Скоуфилд
11 / 10 / 3
Регистрация: 25.09.2015
Сообщений: 238
04.01.2021, 18:18  [ТС]
Работает но всё равно функция далеко не то что нужно.
При смене значения $operator функция один фиг выполняет умножение. Даже если туда пустое значение передать передать)
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
04.01.2021, 19:21
тут наверное обычным switch .. case, что-то типа этого
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function calc($numbers, $math) {
    foreach ($numbers as $item) {
        switch ($math) {
            case '*': echo $item.$math.$item.'='.($item * $item).'<br/>'; break;
            case '+': echo $item.$math.$item.'='.($item + $item).'<br/>'; break;
            case '-': echo $item.$math.$item.'='.($item - $item).'<br/>'; break;
            case '/': echo $item.$math.$item.'='.($item / $item).'<br/>'; break;
            case '%': echo $item.$math.$item.'='.($item % $item).'<br/>'; break;
            default: echo $item.$math.$item.'=?<br/>'; break;
        }
    }
}
calc($numbers, '*');
calc($numbers, '+');
calc($numbers, '-');
calc($numbers, '/');
calc($numbers, '%');
calc($numbers, '!');
0
 Аватар для Майкл Скоуфилд
11 / 10 / 3
Регистрация: 25.09.2015
Сообщений: 238
04.01.2021, 19:30  [ТС]
Скорее всего да, более логично чем то что я делал. Я считал сумму/разницу всех элементов массива.
Вот такой изврат вышел. Хотя должны быть функции типа "Сумма всех элементов масива" но так как этого в курсе пока не было то я не искал.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
$numbers = array(1,2,3,4,5);
    $math = "+";
 
 
    function test($numbers, $math){
        switch ($math){
            case '+' :
                $result = 0;
                for($i = 0; $i < count($numbers); $i++){
                    $result = $result + $numbers[$i];
                }
                echo $result;
                break;
 
            case '-' :
                $result = 0;
                for($i = 0; $i < count($numbers); $i++){
                    $result = $result - $numbers[$i];
                }
                echo $result;
                break;
 
            case '*' :
                $result = 1;
                for($i = 0; $i < count($numbers); $i++){
                    $result = $result * $numbers[$i];
                }
                echo $result;
                break;
 
            case '/' :
                $result = 1;
                for($i = 0; $i < count($numbers); $i++){
                    $result = $result / $numbers[$i];
                }
                echo $result;
                break;
 
            case '%' :
                $result = $numbers[0];
                for($i = 1; $i < count($numbers); $i++){
                    $result = $result % $numbers[$i];
                }
                echo $result;
                break;
 
            default:
                echo "Операция не поддерживается!";
 
        }
    }
 
    test($numbers, $math);
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
04.01.2021, 19:55
Лучший ответ Сообщение было отмечено Майкл Скоуфилд как решение

Решение

если не проходили, то так сойдет.
вот еще один вариант (он работает, но в реальном коде нежелателен)
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function items($numbers, $math) {
    $result = $numbers[0];
    if (in_array($math, array('*', '+', '/', '-', '%'))) {
        for ($i = 1; $i < count($numbers); $i++) {
            eval('$result = '.$result.$math.$numbers[$i].';');
        }
        echo implode($math, $numbers).'='.$result.'<br/>';
    } else {
        echo $math . ' - неизвестный оператор<br/>';
    }
}
items($numbers, '*');
items($numbers, '+');
items($numbers, '/');
items($numbers, '-');
items($numbers, '%');
items($numbers, '!');
1
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
04.01.2021, 20:31
vinikon, Майкл Скоуфилд, за такой код можно смело с универа выгонять Особенно за eval. Дублирование - не хорошо.


У Jewbacabra хороший код, нужно было всего лишь добавить в массив нужные операторы и проверку что оператор валидный. Это элементарно даже для новичка

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
 
$numbers = [1, 2, 3, 4, 5];
$operator = "*";
 
function calc(array $numbers, string $operator) {
    $operators = [
        '*' => fn ($a) => $a * $a,
        '/' => fn ($a) => $a / $a,
        '-' => fn ($a) => $a - $a,
        '+' => fn ($a) => $a + $a,
    ];
    
    If (!array_key_exists($operator, $operators)) {
        return;
    }
    
    $f = $operators[$operator];
    foreach ($numbers as $n) {
        echo $f($n), '<br>';
    }
}
    
calc($numbers, $operator);
А еще, я подозреваю что задача понята неверно. На выходе должно быть только одно число. Т.е. если на входе массив 1,2,3 и знак "+", то результат 6. Тоже достаточно простая задача... вам на подумать
1
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
04.01.2021, 23:34
eval, конечно, осуждаемая конструкция. просто добавил еще один вариант решения этой задачи
Цитата Сообщение от Майкл Скоуфилд Посмотреть сообщение
Как добиться что значение переменной $math работало как знак умножения а не строка
я же предупредил, что
Цитата Сообщение от vinikon Посмотреть сообщение
в реальном коде нежелателен
Цитата Сообщение от tarasalk Посмотреть сообщение
На выходе должно быть только одно число. Т.е. если на входе массив 1,2,3 и знак "+", то результат 6.
так это и реализуется в предыдущем посте у ТС. да и в примере с eval.

Добавлено через 8 минут
и Ваш код то же только для php7.4 и выше. на 7.3 не идет

Добавлено через 18 минут
этот код работает даже в php5.6
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$numbers = array(1,2,3,4,5);
$operator = '*';
function action($first, $operator, $second) {
    $matrix = array(
        '*' => $first * $second,
        '/' => $first / $second,
        '+' => $first + $second,
        '-' => $first - $second,
    );
    return isset($matrix[$operator]) ? $matrix[$operator] : false;
}
 
for ($i = 0; $i < count($numbers); $i++) {
    echo action($numbers[$i], $operator, $numbers[$i]).'<br/>';
}
0
04.01.2021, 23:37

Не по теме:

Цитата Сообщение от vinikon Посмотреть сообщение
и Ваш код то же только для php7.4 и выше. на 7.3 не идет
этот код работает даже в php5.6
https://www.php.net/supported-versions.php

0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
04.01.2021, 23:53
Цитата Сообщение от Jewbacabra Посмотреть сообщение
https://www.php.net/supported-versions.php
эту страницу много раз смотрел, да и в будущем придется. последний раз, примерно 1 месяц назад, когда php8.0 устанавливал. я имел в виду, что этот код работает даже в php5.6, но в первую очередь, в 8, 7.4, 7.3 и в остальных более ранних версиях

Добавлено через 3 минуты
тут вариант для одного числа на выходе
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$numbers = array(1,2,3,4,5);
$operator = '+';
function action($first, $operator, $second) {
    $matrix = array(
        '*' => $first * $second,
        '/' => $first / $second,
        '+' => $first + $second,
        '-' => $first - $second,
    );
    return isset($matrix[$operator]) ? $matrix[$operator] : false;
}
 
$result = $numbers[0] ;
for ($i = 1; $i < count($numbers); $i++) {
    $result = action($result, $operator, $numbers[$i]);
}
if ($result !== false) {
    echo implode($operator, $numbers).'='.$result.'<br/>';
} else {
    echo 'Неизвестный оператор<br/>';
}
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
05.01.2021, 00:00
Цитата Сообщение от vinikon Посмотреть сообщение
тут вариант для одного числа на выходе
Есть одна проблема
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$numbers = array(1,2,3,4,5,0);
$operator = '+';
function action($first, $operator, $second) {
    $matrix = array(
        '*' => $first * $second,
        '/' => $first / $second,
        '+' => $first + $second,
        '-' => $first - $second,
    );
    return isset($matrix[$operator]) ? $matrix[$operator] : false;
}
 
$result = $numbers[0] ;
for ($i = 1; $i < count($numbers); $i++) {
    $result = action($result, $operator, $numbers[$i]);
}
if ($result !== false) {
    echo implode($operator, $numbers).'='.$result.'<br/>';
} else {
    echo 'Неизвестный оператор<br/>';
}
PHP Warning: Division by zero
1
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
05.01.2021, 16:20
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Есть одна проблема
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
$numbers = array('1.8','2',3.2,4,5.1,0);
$operator = '/';
function action($first, $operator, $second) {
    if (filter_var($first, FILTER_VALIDATE_FLOAT) === false) {
        throw new InvalidArgumentException('Недопустимый первый операнд');
    }
    if (filter_var($second, FILTER_VALIDATE_FLOAT) === false) {
        throw new InvalidArgumentException('Недопустимый второй операнд');
    }    
    $matrix = array(
        '*' => $first * $second,
        '/' => $second ? $first / $second : null,
        '+' => $first + $second,
        '-' => $first - $second,
    );
    if (!array_key_exists($operator, $matrix)) {
        throw new InvalidArgumentException('Неизвестный оператор');
    }
    if (is_null($matrix[$operator])) {
        throw new InvalidArgumentException('Деление на ноль');
    }
    return $matrix[$operator];
}
 
function arrayAction($array, $operator) {
    try {
        if (!count($array)) {
            throw new InvalidArgumentException('Нет данных');
        }
        $result = $array[0] ;
        for ($i = 1; $i < count($array); $i++) {
            $result = action($result, $operator, $array[$i]);
        }
        echo implode($operator, $array).'='.$result.'<br/>'; 
    } catch (InvalidArgumentException $e) {
        echo $e->getMessage().'<br/>';
    }
}
 
arrayAction($numbers, $operator);
0
05.01.2021, 16:32

Не по теме:

vinikon, наверно мне следовало это более явно написать, проблема не в том что возможно деление на ноль, а в том что оно возникало в ситуации, где никакого деления вовсе не требовалось. Вряд ли в учебной задаче требуется столько, не относящихся к сути задачи проверок.

0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
05.01.2021, 17:03
Jewbacabra, да, Вы правы. не учел этот вариант. наверное, тогда вот так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$numbers = array(1,2,3,4,5,0);
$operator = '+';
function action($first, $operator, $second) {
    $matrix = array(
        '*' => $first * $second,
        '/' => $second ? $first / $second : null,
        '+' => $first + $second,
        '-' => $first - $second,
    );
    return array_key_exists($operator, $matrix) ? 
        $matrix[$operator] : false;
}
 
function arrayAction($array, $operator) {
    $result = $array[0] ;
    for ($i = 1; $i < count($array); $i++) {
        $result = action($result, $operator, $array[$i]);
        if (is_null($result)) {
            echo 'деление на ноль<br/>';
            return false;
        } elseif ($result === false) {
            echo 'Неизвестный оператор<br/>';
            return false;
        } 
    }
    echo implode($operator, $array).'='.$result.'<br/>';
    return true;   
}
arrayAction($numbers, $operator);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.01.2021, 17:03
Помогаю со студенческими работами здесь

Как привязать к datacontext всю базу данных чтобы в дальнейшем использовать в привязках
Здравствуйте использую LocalDb В качестве базы данных. приложение в формате WPF+MVVM+EF не могу понять как привязать к datacontext всю...

Как использовать в дальнейшем в коде объект по имени, при его динамическом создании?
В приложении WPF в коде динамически создается объект - RadioButton, ему присваивается имя через свойство Name. Вопрос - как в...

Как экранировать знак умножения в CMD?
Здравствуйте, форумчане! Имеется бинарник (app.exe) программы, написанной на C. Допустим, что я хочу перемножить два числа в обратной...

Поместить в стек число 255. Затем верхнее значение стека поместить в переменную w
Поместить в стек число 255. Затем верхнее значение стека поместить в переменную w. uses crt; var a:integer; begin clrscr; a:=100;...

Как достать значения из private void "Button" и использовать их в дальнейшем?
Нажатия &quot;Button&quot; меняют массу груза на лабораторной установке, изменяя вид, и, соответственно, значение массы &quot;P&quot; и угла поворота...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru