Привет, я пытаюсь понять некоторый код в PHP, мне дали задание сделать базовый ввод таблицы умножения, я понял эту часть. Я также должен изменить порядок вывода таблицы. Таким образом, вместо примера, работающего от 1 x 10 = 10 вниз, я должен изменить этот порядок с 10 x 10 = 100 вниз. Эту часть я не могу понять. output

if (isset($_POST['calculate'])) {

$start = $_POST['startNumber'];
$end = $_POST['endNumber'];
$times = $_POST['times'];

for($start; $start <= $end; $start++) {

    $answer = $start * $times;
    echo $start, " x ", $times, " = ", $answer, "<BR>";
    }
}
php
0
DWTF 3 Фев 2022 в 22:05
Что вы подразумеваете под обратным выходом? Каков желаемый результат?
 – 
Barmar
3 Фев 2022 в 22:08
Вы имеете в виду, что хотите повторить с конца, например: for($end; $end >= $start; $end--) {?
 – 
Rodrigo Kravetz
3 Фев 2022 в 22:12
Извините, я должен был быть более ясным. Таким образом, вместо примера, работающего от 1 x 10 = 10 вниз, я должен изменить этот порядок с 10 x 10 = 100 вниз.
 – 
DWTF
3 Фев 2022 в 22:19
Как там разница между ̶ ̶e̶n̶d̶N̶u̶m̶b̶e̶r̶ ̶ ̶ и ̶t̶i̶m̶e̶s̶ ̶? ̶ Почему бы не раз вывешиваем начальный и конечный? ̶ Nevermind, я вижу это сейчас.
 – 
waterloomatt
3 Фев 2022 в 22:23
Глядя на код, это будет a1...aX ($start...$end, где $times является множителем. Таким образом, для таблицы «2 раза» значение будет равно 2.
 – 
Andre M
3 Фев 2022 в 22:28

3 ответа

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

if (isset($_POST['calculate'])) {

    $start = $_POST['startNumber'];
    $end = $_POST['endNumber'];
    $times = $_POST['times'];

    $output = '';
    for($start; $start <= $end; $start++) {
        $answer = $start * $times;
        $output =  $start . " x " . $times ." = " . $answer . "<BR>" . $output;
    }
    
    echo $output;
}
0
Nigel Ren 3 Фев 2022 в 22:50

Вместо этого вы можете просто нажать на массив, перевернуть массив после цикла, соединить массив в строку, а затем повторить вывод.

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

if (isset($_POST['calculate'])) {

    $start = (int)$_POST['startNumber'];
    $end = (int)$_POST['endNumber'];
    $times = (int)$_POST['times'];

    $out = [];
    for(; $start <= $end; $start++) {
        $answer = $start * $times;
        $out[] =  "$start x $times = $answer<br>";
    }

    $out = array_reverse($out);
    echo implode('',$out);
}

Кроме того, вы можете просто пройти цикл в обратном порядке:

if (isset($_POST['calculate'])) {

    $start = (int)$_POST['startNumber'];
    $end = (int)$_POST['endNumber'];
    $times = (int)$_POST['times'];

    for(; $end >= $start; $end--) {
        $answer = $end * $times;
        echo "$end x $times = $answer<br>";
    }
}

Более понятный цикл, вероятно, включал бы range:

if (isset($_POST['calculate'])) {

    $start = (int)$_POST['startNumber'];
    $end = (int)$_POST['endNumber'];
    $times = (int)$_POST['times'];

    foreach(range($end, $start) as $i) {
        echo "$i x $times = ". ($i * $times) ."<br>\n";
    }
}

Вы также можете добавить в array_map, если хотите:

if (isset($_POST['calculate'])) {

    $start = (int)$_POST['startNumber'];
    $end = (int)$_POST['endNumber'];
    $times = (int)$_POST['times'];

    array_map(function($i) use ($times){
        echo "$i x $times = ". ($i * $times) ."<br>\n";
    }, range($end, $start));
}

Или вы можете просто избежать всего этого и просто поменять местами параметры $start и $end.

Итак, вместо этого:

$start = $_POST['startNumber'];
$end = $_POST['endNumber'];

Использовать это:

$end = $_POST['startNumber'];
$start = $_POST['endNumber'];

Но любезно также обращайтесь с данными, отправленными пользователями, с осторожностью, в противном случае их прямое эхо позволяет им вставлять HTML на страницу и выполнять такие действия, как запуск JavaScript. Лучше всего привести его к типу int или float в вашем случае, так как код ожидает, что он будет таким. Помещение (int) впереди приведет к приведению типов Это. Вы также можете использовать (float) или (double) и т. д. Вы также можете делать такие вещи, как выполнение сначала математической операции, например, умножение на 1 и т. д. В других ситуациях, когда вы работаете не с числами, а со строками, вы d обычно используют htmlentities или htmlspecialchars перед выводом строки, подобной вводу, который пользователь отправил обратно в html, чтобы он правильно экранировался для отображения как текст внутри html, а не позволять им использовать html и/или запускать javascript и т. д.

Таким образом, вместо:

$start = $_POST['startNumber'];
$end = $_POST['endNumber'];

Вы бы имели:

$end = (int)$_POST['startNumber'];
$start = (int)$_POST['endNumber'];

Или же:

$end = (float)$_POST['startNumber'];
$start = (float)$_POST['endNumber'];

Или

$end = $_POST['startNumber'] * 1;
$start = $_POST['endNumber'] * 1;

И т.п.

Если бы мне пришлось выбирать лично, я бы выбрал диапазон.

0
Kevin Y 3 Фев 2022 в 23:42
1
Во втором примере вы хотите использовать $end вместо $start в цикле for. Например, sandbox.onlinephpfunctions.com/code/…
 – 
waterloomatt
3 Фев 2022 в 22:40
1
Фиксированный
 – 
Kevin Y
3 Фев 2022 в 22:46