2015-12-13 62 views
0

我有一個名爲test的數組。循環時,我想在10秒後從數組中獲得下一個值。例如,回顯的第一個值爲A.PHP - 10秒後從數組中獲取新值

該值爲A.然後,在10秒鐘後,該值將被替換爲B.該值爲B.再次10秒後,該值將被替換爲C.值爲C.它將重複獲得下一個值並返回到A並繼續該過程。

我到目前爲止得到的是它一個接一個地執行,但沒有替換值。我只想改變數值,但是「值是」這個句子保持不變,而不是全部執行「值是B」,「值是C」等等。

這是我到目前爲止嘗試過的。

<?php 

@ini_set("output_buffering", "Off"); 
@ini_set('implicit_flush', 1); 
@ini_set('zlib.output_compression', 0); 
@ini_set('max_execution_time',1200); 
header('Content-type: text/html; charset=utf-8'); 
$test=array("A","B","C","D","E"); 

foreach ($test as $value) { 
    $var="The value is $value"; 
    echo $var; 
    if(sleep(10)!=0) 
    { 
     echo "sleep failed script terminating"; 
     break; 
    } 

    flush(); 
    ob_flush(); 

} 

    ?> 
+0

前加上「退格」鍵碼(\x08)你知道PHP的服務器端運行? –

+0

@u_mulder對不起,我不明白 –

+0

你不會這樣做 - 作爲服務器端語言PHP在頁面完全加載到瀏覽器之前執行,這意味着你不能停止腳本和希望你的瀏覽器能夠顯示任何連貫的內容(它需要一個完整的html文檔才能正確呈現,因此PHP腳本的結尾和通過http完全傳輸到客戶端)。 – Calimero

回答

0

您可以簡化很多。對我來說,這個工作沒有問題:

<?php 
@ini_set("output_buffering", "Off"); 
@ini_set('implicit_flush', 1); 
@ini_set('zlib.output_compression', 0); 
@ini_set('max_execution_time',1200); 
header('Content-type: text/html; charset=utf-8'); 
$test=array("A","B","C","D","E"); 

foreach ($test as $value) { 
    echo "The value is $value<br>\n"; 
    sleep(10); 
    flush(); 
    ob_flush(); 
} 

輸出顯然是:

The value is A 
The value is B 
The value is C 
The value is D 
The value is E 

考慮您的評論在這裏你真正想要什麼東西時,你並沒有在這個問題說,在所有:到用每次迭代覆蓋可見輸出。這是完全不同的東西。正如評論中提到的,這是不同的,也不是微不足道的,因爲你必須「收回」你已經衝過的東西。

以下是CLI的工作變體,僅顯示一個句子,大寫字母每10秒更改一次。對於Web環境來說,事情更復雜,你必須實現一些小型的客戶端邏輯,從DOM中再次移除先前刷新的文本。但是,爲了直接遍歷客戶端上的這些字母,將會容易得多千倍。

<?php 
@ini_set("output_buffering", "Off"); 
@ini_set('implicit_flush', 1); 
@ini_set('zlib.output_compression', 0); 
@ini_set('max_execution_time',1200); 
header('Content-type: text/html; charset=utf-8'); 
$test=array("A","B","C","D","E"); 

foreach ($test as $value) { 
    echo "The value is $value"; 
    flush(); 
    sleep(10); 
    echo str_pad('', 14, "\x08"); 
} 
+0

我的意思是隻回顯一行,即「值是$ value」。該值需要每10秒更換一次,它會被替換。不打印具有新價值的另一條線。 –

+0

啊,好吧,那是完全不同的東西。這是不可能的,只需追加輸出,因爲這並不能消除你之前刷新的內容。對於這樣的事情,你需要一種不同的方法:在CLI中,你可以簡單地使用退格字符來「消滅」最後一行,對於需要使用javascript來實現某些客戶端邏輯的Web環境。這個問題根本不明確。 – arkascha

0

有控制檯的解決方案:只要呼應值

<?php 
$test=array("A","B","C","D","E"); 

echo "The value is "; 
foreach ($test as $value) { 
    echo "\x08" . $value; 
    sleep(10); 
} 
echo "\n";