我有一系列物品。有两种“类型”或项目:标题行和常规行。我想打印标题只有当它下面有任何“常规”行时(在下一个标题之前)。
(这是一种简化 - 实际上我无法查看当前迭代中的下一项)。
为了解决这个问题,我使用了缓冲控制。我清除并在每个标题行启动缓冲区,并在每个常规行中刷新缓冲区。因此,如果标题后面有一个标题(缓冲区将被清理),标题将不会打印,如果有一个常规行来“冲洗”它将被刷新给用户。
(psudeo代码)
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 :(得分:0)
而不是输出到缓冲区output to a file buffer instead。然后只发送整个文件(这有点棘手但如果你正确管理重定向它应该工作正常):
伪码:
for i in array:
if i is heading:
// output to file buffer
echo "header $i";
else:
// stop output to file buffer
echo "regular $i"
答案 1 :(得分:0)
我的建议是,即使您无法查看 next 项,我认为您可以跟踪上一个项。我认为无论你的输出方法如何,这都应该有用。
$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.
}
}