Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP输出缓冲区控件_Php_Buffer - Fatal编程技术网

PHP输出缓冲区控件

PHP输出缓冲区控件,php,buffer,Php,Buffer,我有一系列的物品。有两种类型或项目:标题行和常规行。我只想打印标题,如果在下一个标题之前,标题下有任何常规行 这是一种简化——实际上,我无法查看当前迭代中的下一项 为了解决这个问题,我使用了缓冲区控制。我在每个标题行清除并启动缓冲区,在每个常规行中刷新缓冲区。所以标题不会打印,如果有一个标题后,缓冲区将被清理,并将刷新到用户,如果有一个常规行刷新它 psudeo代码 for i in array: if i is heading: ob_end_clean();

我有一系列的物品。有两种类型或项目:标题行和常规行。我只想打印标题,如果在下一个标题之前,标题下有任何常规行

这是一种简化——实际上,我无法查看当前迭代中的下一项

为了解决这个问题,我使用了缓冲区控制。我在每个标题行清除并启动缓冲区,在每个常规行中刷新缓冲区。所以标题不会打印,如果有一个标题后,缓冲区将被清理,并将刷新到用户,如果有一个常规行刷新它

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.

我喜欢我的解决方案,但有没有办法让它发挥作用?还是一开始这是一个糟糕的解决方案?感谢您不要将数据输出到缓冲区,

。最后,只需发送整个文件。这有点棘手,但如果您正确管理重定向,它应该可以正常工作:

伪代码:

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转换器吗?或者有其他方法可以做到这一点吗?这是一个有趣的想法。我会尝试一下,让你知道