2015-04-20 138 views
0

我有一個項目的數組。有兩種「類型」或項目:標題行和常規行。我只想在它下面有任何「常規」行時(在下一個標題之前)打印標題。PHP輸出緩衝區控件

(這是一個簡化 - 在實踐中我不會看到當前迭代中的下一個項目)。

爲了解決這個問題,我使用了緩衝區控制。我清除並在每個標題行啓動緩衝區,並在每個常規行中刷新緩衝區。所以如果有一個標題後標題不會打印(緩衝區將被清除),並且如果有一個常規的行將其「刷新」,則會被刷新到用戶。

(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。

cannot modify header information - headers already sent. 

我喜歡我的解決方案,但有一種方法,使其工作:現在,緩衝在ob_end_flush()函數,當我嘗試下載PDF產生這個錯誤發送給用戶?或者這是一個不好的解決方案?謝謝

+0

而不是使用輸出緩衝區,你可以建立一個字符串,並在最後回顯它? –

+0

@ Don'tPanic這浪費了大量的記憶,並且永久地緩衝。 – Brad

+0

你可以刪除單擊PDF選項上的標題錯誤,即確定PDF選項已被點擊並在它ob_clean用於刪除標題錯誤 – DevLakshman

回答

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" 
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

有趣的想法。將嘗試一下,讓你知道 – danielb