在PHP中分别输出两行到控制台

时间:2016-08-22 19:22:39

标签: php command-line-interface

我写了这个小的PHP脚本,从0到9计数,同时也显示了计算数字的总和。

<?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";

如您所见,在每次迭代中,我正在清理该行(8backspace的ASCII代码)并在同一行显示新文本。

这很好用,但现在我想在两条不同的行中显示Count和Total,并以与我用一行相同的方式设置两条线的动画。所以我尝试了这段代码:

<?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";

这里的问题是backspace\n字符处停止,因此删除了第二行,但保留了第一行,它提供了以下输出:

Counter: 0
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5
Counter: 6
Counter: 7
Counter: 8
Counter: 9
Total: 45

有没有正确的方法来解决这个问题?

由于

2 个答案:

答案 0 :(得分:5)

我终于找到了一个有效的方法:

<?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";

这可以从一些ansicodes中获益,请查看This document了解更多详情。

感谢@Joshua Klein的帮助。

答案 1 :(得分:1)

非常蹩脚的回答(适用于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";

真正的答案与\ r(换行)或不同的ansicodes字符有关,你可以在这里阅读:
 Clear PHP CLI output