Почему этот цикл foreach повторяется дважды?

На самом деле вопрос в заголовке - у меня есть этот цикл foreach, и он, кажется, дважды повторяет мой массив.

ob_start();

$array = str_split(strtolower($_GET['text']));

foreach ($array as $char) {
    error_log($_GET['text'] . ', ' . sizeof($array) . ', ' . $char);
}

$result = ob_get_contents(); 

Я обнаружил, что приведенный выше код создает следующий журнал при передаче URL-адреса следующим образом: index.php?text=Hi

[22-Oct-2018 20:05:37 Europe/London] Hi, 2, h
[22-Oct-2018 20:05:37 Europe/London] Hi, 2, i
[22-Oct-2018 20:05:37 Europe/London] Hi, 2, h
[22-Oct-2018 20:05:37 Europe/London] Hi, 2, i

Отладка показывает, что массив имеет длину всего 2, поэтому я действительно не уверен, что это может быть. Спасибо!


После дополнительной отладки я обнаружил следующее:

if (!isset($_GET['text'])) {
    header('HTTP/1.0 404 Not Found');
    die();
}

echo uniqid() . '</br>';

//ob_start();

$total = 0;
$array = str_split(strtolower($_GET['text']));

foreach ($array as $char) {
    echo $_GET['text'] . ', ' . sizeof($array) . ', ' . $char . '</br>';
}

//$result = ob_get_contents();

echo $result;

Производит это:

5bce311d3d6bd
Hi, 2, h
Hi, 2, i

Но, раскомментировав две закомментированные строки, я получаю следующее:

5bce313b9f29d
Hi, 2, h
Hi, 2, i
Hi, 2, h
Hi, 2, i

person Toby Smith    schedule 22.10.2018    source источник
comment
Но один цикл на символ — это две итерации — OP здесь показывает вывод с четырьмя итерациями. Хотя я не вижу причин, по которым показанный код мог бы это сделать. Если только сценарий не запускался дважды в одну и ту же секунду, записывая показанный вывод журнала.   -  person Darragh Enright    schedule 22.10.2018
comment
Не воспроизводится только из примера кода. Кроме того, неясно, вызывается ли код/скрипт дважды (двойной запрос, предварительная выборка браузера и т. д.) или выходные данные дважды попадают в журнал.   -  person mario    schedule 22.10.2018
comment
@mario Я немного расширил пример кода. Добавление, по-видимому, является причиной, поскольку я также не могу воспроизвести его без добавления.   -  person Toby Smith    schedule 22.10.2018
comment
Я не вижу никакого способа, которым функции ob_XXX могли бы повлиять на error_log().   -  person Barmar    schedule 22.10.2018
comment
Попробуйте добавить индикатор, чтобы скрипт не запускался дважды. Например, вы можете установить переменную вне цикла, используя uniqid(), и добавить ее в свой журнал.   -  person HTMHell    schedule 22.10.2018


Ответы (1)


Я думаю, что мне, возможно, нужно больше узнать о функциональности ob_...?

Следующий код кажется последовательным и надежным:

if (!isset($_GET['text'])) {
    header('HTTP/1.0 404 Not Found');
    die();
}

echo uniqid() . '</br>';

ob_start();

$total = 0;
$array = str_split(strtolower($_GET['text']));

foreach ($array as $char) {
    echo $_GET['text'] . ', ' . sizeof($array) . ', ' . $char . '</br>';
}

ob_flush();
person Toby Smith    schedule 22.10.2018