Текст над другим текстом, используя "\ r" в php, делает строку прогресса - PullRequest
0 голосов
/ 30 августа 2018

У меня есть эта проблема при использовании \r для создания простой строки Progress с PHP.

Этот пример кода выглядит как мой настоящий, но он слишком большой, чтобы написать его здесь.

$percent = 0;
for($i=0; $i<=1000000000; $i++){ //big number to take time looping and testing
    if( ($i % 10000000) == 0 ){ //thats mean each one percent do something
        echo "This is just a simple text\n Progress: $percent% just a simple progress line with php \r";
        $percent++;
    }
}

Здесь вывод выглядит следующим образом.

   php file.php
This is just a simple text
This is just a simple texte progress line with php 
This is just a simple texte progress line with php 
This is just a simple texte progress line with php 
This is just a simple texte progress line with php 
This is just a simple texte progress line with php 
^Crogress: 5% just a simple progress line with php 

Но я хочу, чтобы вывод был таким.

    php file.php
This is just a simple text
This is just a simple text
This is just a simple text
This is just a simple text
This is just a simple text
This is just a simple text
^Crogress: 5% just a simple progress line with php 

Использование sleep(1); Не помогает тоже.

Вся проблема в том, что текст строки прогресса Progress: 5% just a simple progress line with php становится выше над другим текстом.

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Вы просто не можете, \ r возвращается к началу строки. Следующий эхо начинается там, поэтому ваша первая часть This is just a simple text напечатана на том, что уже существует.

Если вы хотите очистить оставшийся текст, добавьте пробелы после текста, чтобы перезаписать оставшуюся часть Progress: $percent% just a simple progress line with php

Что-то вроде этого должно сделать:

echo "This is just a simple text \nProgress: $percent% just a simple progress line with php\r";

Это довольно сложно, если вы измените второй текст, чтобы лучше подходил примерно так (не проверено):

$percent = 0;
for($i=0; $i<=1000000000; $i++){ //big number to take time looping and testing
    if( ($i % 10000000) == 0 ){ //thats mean each one percent do something
        $first_line = "This is just a simple text";
        $second_line = "Progress: $percent% just a simple progress line with php\r";
        $diff = strlen($second_line) - strlen($first_line);
        echo $first_line.str_repeat(' ',$diff)."\n".$second_line;
        $percent++;
    }
}

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

0 голосов
/ 30 августа 2018

Если вы добавите пробел в конце первой строки, он напишет поверх второй, например:

 $percent = 0;
 for($i=0; $i<=1000000000; $i++){ //big number to take time looping and testing
     if( ($i % 10000000) == 0 ){ //thats mean each one percent do something
         echo "This is just a simple text                                \n";
         echo "Progress: $percent% just a simple progress line with php \r";
         $percent++;
     }
 }
0 голосов
/ 30 августа 2018

Измените \n на \r, и оно получится так, как вы ожидаете.

echo "This is just a simple text\rProgress: {$percent}%\r";

Вот скрипка, чтобы увидеть, что на выходе выше: https://www.tehplayground.com/2Cst7KcFlOsdsjfN

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