PHP, why do I get an extra print at the end?

<?php
$VarC = 6;
$VarD = 2;
$ctA = 1;
$ctB = 2;
$VarAns = 0;
$VarAns = $ctA * ($ctB+$VarC) / $VarD;
do {
    do {
        $VarAns = $ctA * ($ctB+$VarC) / $VarD;
        echo ("X = $ctA * ($ctB + 6) / 2 is equal to: $VarAns<br>");
        $ctA = $ctA + 1;
    } while ($ctA <= 10);

    echo ("<br>");
    $ctA = 1;
    $ctB = $ctB + 2;
    $VarAns = $ctA * ($ctB+$VarC) / $VarD;
    echo ("X = $ctA * ($ctB + 6) / 2 is equal to: $VarAns<br>");
    $ctA = $ctA + 1;

} while ($ctB <= 10);

?>

I get an extra line at the end that I should not get, any ideas? Im trying to print and stop when I reach 10, but it goes to 12!

I get

X = 1 * (2 + 6) / 2 is equal to: 4
X = 2 * (2 + 6) / 2 is equal to: 8
X = 3 * (2 + 6) / 2 is equal to: 12
X = 4 * (2 + 6) / 2 is equal to: 16
X = 5 * (2 + 6) / 2 is equal to: 20
X = 6 * (2 + 6) / 2 is equal to: 24
X = 7 * (2 + 6) / 2 is equal to: 28
X = 8 * (2 + 6) / 2 is equal to: 32
X = 9 * (2 + 6) / 2 is equal to: 36
X = 10 * (2 + 6) / 2 is equal to: 40

X = 1 * (4 + 6) / 2 is equal to: 5
X = 2 * (4 + 6) / 2 is equal to: 10
X = 3 * (4 + 6) / 2 is equal to: 15
X = 4 * (4 + 6) / 2 is equal to: 20
X = 5 * (4 + 6) / 2 is equal to: 25
X = 6 * (4 + 6) / 2 is equal to: 30
X = 7 * (4 + 6) / 2 is equal to: 35
X = 8 * (4 + 6) / 2 is equal to: 40
X = 9 * (4 + 6) / 2 is equal to: 45
X = 10 * (4 + 6) / 2 is equal to: 50

X = 1 * (6 + 6) / 2 is equal to: 6
X = 2 * (6 + 6) / 2 is equal to: 12
X = 3 * (6 + 6) / 2 is equal to: 18
X = 4 * (6 + 6) / 2 is equal to: 24
X = 5 * (6 + 6) / 2 is equal to: 30
X = 6 * (6 + 6) / 2 is equal to: 36
X = 7 * (6 + 6) / 2 is equal to: 42
X = 8 * (6 + 6) / 2 is equal to: 48
X = 9 * (6 + 6) / 2 is equal to: 54
X = 10 * (6 + 6) / 2 is equal to: 60

X = 1 * (8 + 6) / 2 is equal to: 7
X = 2 * (8 + 6) / 2 is equal to: 14
X = 3 * (8 + 6) / 2 is equal to: 21
X = 4 * (8 + 6) / 2 is equal to: 28
X = 5 * (8 + 6) / 2 is equal to: 35
X = 6 * (8 + 6) / 2 is equal to: 42
X = 7 * (8 + 6) / 2 is equal to: 49
X = 8 * (8 + 6) / 2 is equal to: 56
X = 9 * (8 + 6) / 2 is equal to: 63
X = 10 * (8 + 6) / 2 is equal to: 70

X = 1 * (12 + 6) / 2 is equal to: 9

The last line X = 1 * (12 + 6) / 2 is equal to: 9 should not be there

Upvotes: 0

Views: 108

Answers (3)

fusion3k
fusion3k

Reputation: 11689

The problem is not the while loop, it is that your initial code doesn't work and you has used a trick.

The nested do/while produce 10 lines at first primary do/while loop, but only nine at following loops, so you have added an additional echo before closing primary loop to “anticipate” next loop: this echo is performed even in the last loop, then the additional unexpected line.

Simply change $ctA = 1; in $ctA = 0; (in the loop) and remove the final echo:

$VarC = 6;
$VarD = 2;
$ctA = 1;
$ctB = 2;
$VarAns = 0;
$VarAns = $ctA * ($ctB + $VarC) / $VarD;

do {
    do {
        $VarAns = $ctA * ($ctB + $VarC) / $VarD;
        echo ("X = $ctA * ($ctB + 6) / 2 is equal to: $VarAns<br>\n");
        $ctA = $ctA + 1;
    } while ($ctA <= 10);

    echo ("<br>\n");
    $ctA = 0; // <----------------
    $ctB = $ctB + 2;
    $VarAns = $ctA * ($ctB + $VarC) / $VarD;
    $ctA = $ctA + 1;

} while ($ctB <= 10);

3v4l.org demo

Upvotes: 1

Zamrony P. Juhara
Zamrony P. Juhara

Reputation: 5262

Are you sure that it prints following lines?

X = 10 * (8 + 6) / 2 is equal to: 70

X = 1 * (12 + 6) / 2 is equal to: 9

Because your code should output:

X = 10 * (8 + 6) / 2 is equal to: 70

X = 1 * (10 + 6) / 2 is equal to: 8
X = 2 * (10 + 6) / 2 is equal to: 16
...
X = 10 * (10 + 6) / 2 is equal to: 80

X = 1 * (12 + 6) / 2 is equal to: 9

Look at condition when $ctA == 1and $ctB == 8. When execution enters:

do {
    $VarAns = $ctA * ($ctB+$VarC) / $VarD;
    echo ("X = $ctA * ($ctB + 6) / 2 is equal to: $VarAns<br>");
    $ctA = $ctA + 1;
} while ($ctA <= 10);

It will print:

X = 1 * (8 + 6) / 2 is equal to: 7
...
X = 10 * (8 + 6) / 2 is equal to: 70

at last iteration of inner loop, $ctA == 10, so after increase by 1, now $ctA == 11, then it exits inner do .. while. Next, it enters:

echo ("<br>");
$ctA = 1;
$ctB = $ctB + 2;

It prints another break line, reset $ctA value to 1. Increase $ctB by 2. So now $ctA == 1 and $ctB == 10 and it enters:

$VarAns = $ctA * ($ctB+$VarC) / $VarD;
echo ("X = $ctA * ($ctB + 6) / 2 is equal to: $VarAns<br>");
$ctA = $ctA + 1;

which prints:

X = 1 * (10 + 6) / 2 is equal to: 8

Next, it increase $ctA value by 1, so now $ctA == 2 and $ctB == 10. So condition ($ctB <= 10) becomes true and outer do .. while is repeated once more. It then enters inner loop and prints:

X = 2 * (10 + 6) / 2 is equal to: 8
...
X = 10 * (10 + 6) / 2 is equal to: 80

It exits inner loop and print another break line and last output

X = 1 * (12 + 6) / 2 is equal to: 9

The problem is multiple call to this code:

echo ("X = $ctA * ($ctB + 6) / 2 is equal to: $VarAns<br>");

and not reset $ctA to 0.

Upvotes: 0

Eduardo Salazar
Eduardo Salazar

Reputation: 187

Instead of

do {
    ....
} while (...);

do:

while(..){
    ....
}

Upvotes: 0

Related Questions