Управление выходным буфером PHP

У меня есть массив предметов. Есть два «типа» или элементы: строка заголовка и обычная строка. Я хочу напечатать заголовок, только если под ним есть «обычные» строки (до следующего заголовка).

(Это упрощение — на практике я не смогу посмотреть на следующий элемент в текущей итерации).

Чтобы решить эту проблему, я использовал контроль буфера. Я очищаю и запускаю буфер в каждой строке заголовка, а в каждой обычной строке я очищаю буфер. Таким образом, заголовок не будет печататься, если после него будет заголовок (буфер будет очищен), и он будет сброшен пользователю, если есть обычная строка для его «очистки».

(псевдо код)

for i in array:
if i is heading:
ob_end_clean();
ob_start();
echo "header $i";
else:
ob_end_flush();
echo "regular $i"

Это прекрасно работает.

Проблема в том, что у меня есть возможность загрузить страницу в формате PDF, и это сломало ее. Это работает так: если в верхней части страницы установлен флаг pdf, был запущен буфер, а в нижней части кода буфер был выгружен в переменную и отправлен в pdf api в виде строки. Теперь буфер отправляется пользователю по адресу ob_end_flush (), который выдает эту ошибку, когда я пытаюсь скачать pdf:

cannot modify header information - headers already sent.

Мне нравится мое решение, но есть ли способ заставить его работать? Или это плохое решение для начала? Спасибо

0

Решение

Вместо вывода в буфер, вывод в буфер файлов вместо. В конце концов просто отправьте весь файл (это немного сложно, но оно должно работать нормально, если вы правильно управляете перенаправлениями):

псевдокод:

for i in array:
if i is heading:
// output to file buffer
echo "header $i";
else:
// stop output to file buffer
echo "regular $i"
0

Другие решения

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

$previous = '';
foreach ($rows as $row) {
if ($row == 'header') {
// Wait to print header rows depending on what the next row is.
$previous = $row;
} else {
// For regular rows, print the preceding header row (if there is one.)
echo $previous;
echo $row; // Print the regular row.
$previous = ''; // Then clear the saved header row.
}
}
0