PHP输出缓冲区控件
我有一系列的物品。有两种类型或项目:标题行和常规行。我只想打印标题,如果在下一个标题之前,标题下有任何常规行 这是一种简化——实际上,我无法查看当前迭代中的下一项 为了解决这个问题,我使用了缓冲区控制。我在每个标题行清除并启动缓冲区,在每个常规行中刷新缓冲区。所以标题不会打印,如果有一个标题后,缓冲区将被清理,并将刷新到用户,如果有一个常规行刷新它 psudeo代码PHP输出缓冲区控件,php,buffer,Php,Buffer,我有一系列的物品。有两种类型或项目:标题行和常规行。我只想打印标题,如果在下一个标题之前,标题下有任何常规行 这是一种简化——实际上,我无法查看当前迭代中的下一项 为了解决这个问题,我使用了缓冲区控制。我在每个标题行清除并启动缓冲区,在每个常规行中刷新缓冲区。所以标题不会打印,如果有一个标题后,缓冲区将被清理,并将刷新到用户,如果有一个常规行刷新它 psudeo代码 for i in array: if i is heading: ob_end_clean();
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.
我喜欢我的解决方案,但有没有办法让它发挥作用?还是一开始这是一个糟糕的解决方案?感谢您不要将数据输出到缓冲区,。最后,只需发送整个文件。这有点棘手,但如果您正确管理重定向,它应该可以正常工作: 伪代码:
for i in array:
if i is heading:
// output to file buffer
echo "header $i";
else:
// stop output to file buffer
echo "regular $i"
我的建议是,即使你不能看下一个项目,我认为你可以跟踪上一个项目。我认为无论您的输出方法如何,这都应该有效
$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.
}
}
不使用输出缓冲区,你能建立一个字符串并在结尾回显吗?@Don'tPanic浪费大量内存,永久缓冲也是如此。您是否可以在单击pdf选项时删除标题错误,即标识pdf选项已被单击&在它被用于删除标题之后error@Don“tPanic不起作用,因为在标题的迭代中,我不知道是否要在字符串中包含Inot@Brad对但是,这一切不都必须作为字符串发送到PDF转换器吗?或者有其他方法可以做到这一点吗?这是一个有趣的想法。我会尝试一下,让你知道