2009-06-15 137 views
0

下面是不是实现了我的愿望PHP输出缓冲堆叠

<? 
echo ob_start() . "<br>"; 
echo "1x<br>"; 
echo ob_start() . "<br>"; 
echo "2x<br>"; 
echo ob_flush() . "<br>"; 
echo "3x<br>"; 
echo ob_flush() . "<br>"; 
?> 

输出如下

1 
1x 
1 
2x 
1 
3x 
1 

我想沿着

1x 
3x 
2x 

我东西线假设问题在于它将第二个ob_start()的输出放在第一个输出缓冲区中。但是,我如何获得理想的输出?

基本上我试图实现的是在输出中提供需要在HTML文档头部的标签。也就是说,在脚本已经打印完文档头信息之后,它就需要提供这些信息了。

+0

我相信你应该多告诉我们一些关于问题的背景,因为有多种方法可以解决问题。 – 2009-06-15 06:42:56

回答

1

你为什么不只是写

echo "1x"."<br>"; 
echo "3x"."<br>"; 
echo "2x"."<br>"; 
2

参考PHP手册ob_start。你不想

echo ob_start(); 

因为函数返回true或false,那么它会输出一个1或0 代替

ob_start(); 
echo "1x" . "<br />"; 
echo "2x" . "<br />"; 
echo "3x" . "<br />"; 
ob_flush(); 

总之你的目标是不是很清楚。 ob_start()用于在发送之前清除一堆输出。它不应该用作堆栈。如果您想在PHP中使用堆栈,请尝试SplStack

+0

我知道这些函数调用返回0或1.我只是打印它们来证明它们被正确调用。 – 2009-06-15 06:57:08

1

什么如下:

<?php 
echo ob_start(); 
echo "1x<br>"; 
$keep_me_1 = ob_get_contents(); /* optional and for later use */ 
echo ob_flush(); 

echo ob_start(); 
echo "3x<br>"; 
$keep_me_2 = ob_get_contents(); /* optional and for later use */ 
echo ob_flush(); 

echo ob_start(); 
echo "3x<br>"; 
$keep_me_3 = ob_get_contents(); /* optional and for later use */ 
echo ob_flush(); 

?> 

如果您想使用更多的“堆栈”的功能,你应该在ob_end_flush看一看。

+0

这就是我真正做到的。非常接近您所描述的内容,但是您需要调用ob_clean()而不是ob_flush() ob_start(); echo“1
”; $ g_ob [] = ob_get_contents(); ob_clean(); ob_start(); echo“2
”; $ g_ob [] = ob_get_contents(); ob_clean(); ob_start(); echo“3
”; $ g_ob [] = ob_get_contents(); ob_clean(); echo $ g_ob [0]; echo $ g_ob [2]; echo $ g_ob [1]; – 2009-06-15 09:59:00

0

您可以使用ob_get_contents()将内部缓冲区的内容保存为字符串,然后调用ob_end_clean()将内容抛出。稍后,在外部缓冲区中使用回调函数来写出字符串。

0

你的问题是ob_*函数不应该是echo'ed。

<? 
ob_start() . "<br>"; 
echo "1x<br>"; 
ob_start() . "<br>"; 
echo "2x<br>"; 
ob_flush() . "<br>"; 
echo "3x<br>"; 
ob_flush() . "<br>"; 
?> 

ob_start()函数返回一个布尔值。因此,基本上,您的代码只是回显true值,当转换为字符串时,该值将转换为1