Reputation: 2828
I have written this small PHP script which counts from 0 to 9 while also showing the sum of the counted numbers.
<?php
$sum = 0;
$line = '';
for ($i=0; $i < 10; $i++) {
$sum += $i;
echo str_repeat(chr(8), strlen($line)); // cleaning the line
$line = "Counter: {$i} | Total: {$sum}";
echo $line; // Outputing the new line
sleep(1);
}
echo "\n";
As you see, on each iteration, I am cleaning up the line (8
is the ASCII code for backspace
) and showing the new text in the same line.
This works fine, but now I want to show the Count and the Total in two different lines and animate the two lines in the same way that I did with one line. So I tried this code:
<?php
$sum = 0;
$line = '';
for ($i=0; $i < 10; $i++) {
$sum += $i;
echo str_repeat(chr(8), strlen($line)); // cleaning the line
$line = "Counter: {$i}\nTotal: {$sum}";
echo $line; // Outputing the new line
sleep(1);
}
echo "\n";
The issue here is that backspace
stops at the \n
character and so it deletes the second line but leaves the first line as it is which gives the following output:
Counter: 0
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5
Counter: 6
Counter: 7
Counter: 8
Counter: 9
Total: 45
Is there a proper way to solve this ?
Thanks
Upvotes: 8
Views: 635
Reputation: 199
Really lame answer (works on linux):
<?php
$sum = 0;
$line = '';
for ($i=0; $i < 10; $i++) {
$sum += $i;
echo str_repeat(chr(8), strlen($line)); // cleaning the line
$line = "Counter: {$i}\nTotal: {$sum}";
echo $line; // Outputing the new line
sleep(1);
system("clear");
}
echo "\n";
The real answer has something to do with the \r (linefeed) or different ansicodes characters which you can read about here:
Clear PHP CLI output
Upvotes: 1
Reputation: 2828
I finally found a working soution:
<?php
$sum = 0;
$line = '';
for ($i=0; $i < 10; $i++) {
$sum += $i;
$line = "Counter: {$i}\nTotal: {$sum}";
echo $line; // Outputing the new line
sleep(1);
echo chr(27) . "[0G"; // go to the first column
echo chr(27) . "[1A"; // go to the first line
echo chr(27) . "[2M"; // remove two lines
}
echo "Total: {$sum}\n";
This takes benefit from some ansicodes, check This document for more details.
Thanks @Joshua Klein for help.
Upvotes: 5