Как отобразить только один раз на странице в функции в PHP? - PullRequest
0 голосов
/ 22 января 2019

Вот моя функция:

curl_setopt( $curl, CURLOPT_PROGRESSFUNCTION, function ( $resource, $download_size, $downloaded_size, $upload_size, $uploaded_size) use ($array)
{
static $previousProgress = 0;

    if ( $download_size == 0 ) {
        $progress = 0;
    } else {
        $progress = round( $downloaded_size * 100 / $download_size );
    }

Как видите, я вставляю свои собственные переменные с use в конце функции.

Что я пытаюсьсделать это просто повторить эту строку ОДНАЖДЫ после условия else

echo ' ' . $progress . '%' . ' (' . bytes($downloaded_size) . ' of ' . bytes($download_size) . ') ';

Я пробовал такие вещи, как

static $previousProgress = 0;
$count = $previousProgress++;

    } else {
    if ($count == 1) { echo echo ' ' . $progress . '%' . ' (' . bytes($downloaded_size) . ' of ' . bytes($download_size) . ') '; }
        $progress = round( $downloaded_size * 100 / $download_size );
    }

Но в этот момент функция уже запустила неизвестныйколичество раз (50 или 60 иногда), прежде чем оно достигнет условия else.

Я, конечно, могу сделать это

static $previousProgress = 0;
    $count = $previousProgress++;
    if ($count == 1) { echo ' ' . $progress . '%' . ' (' . bytes($downloaded_size) . ' of ' . bytes($download_size) . ') '; }

И это работает, чтобы эхо только один раз ..но проблема в CURL не в том, чтобы переменные $downloaded_size или $download_size были установлены и отображались как 0 bytes - поэтому он должен быть в другом состоянии.

Я пытался использовать true / false переменных, как это обычно делается для вывода чего-то один раз в цикле for или foreach, но поскольку функция просто рекурсивно работает до истечения времени ожидания, функция запускается снова, и это не работает.

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

Пробовал другие случайные вещи, но я явно что-то упустил.Как я могу повторить размер загрузки только один раз в повторяющейся функции?

1 Ответ

0 голосов
/ 22 января 2019

Статическая логическая переменная должна делать то, что вы хотите.

static $firstTime = true;
if ($firstTime) {
    echo "something";
    $firstTime = false;
}

Проблема с вашим кодом, вероятно, из-за того, что вы использовали постинкремент. Если $previousProgress равно 0, строка:

$count = $previousProgress++;

установит $count в 0 (старое значение) при увеличении $previousProgress до 1. Таким образом, условие if ($count == 1) не выполнялось до второй итерации. Если бы вы использовали ++$previousProgress, это установило бы их обоих на 1. В этом разница между преинкрементом и постинкрементом.

...