2012-02-07 98 views
2

我遇到了一個foreach的問題,他的主要建議是檢查服務器是否啓動,然後訪問該文件,並且我卡在一個foreach上,我想讓它重複一步。例如,我有以下代碼:PHP Foreach重複自己

<?php 
$Array = array("one","two","tree","four"); 
next($Array); 

$i = 0; 
foreach($Array as $Key=>$Value) 
{ 
    $i++; 
    echo "Key=".$Key." VAL=".$Value."<br>"; 

    if($Key==2) prev($Array); 

    if($i==10) break; 
} 
?> 

是outputing:

Key=0 VAL=one 
Key=1 VAL=two 
Key=2 VAL=tree 
Key=3 VAL=four 

,我想讓它,它會輸出

Key=0 VAL=one 
Key=1 VAL=two 
Key=2 VAL=tree 
Key=2 VAL=tree 
Key=2 VAL=tree 
Key=2 VAL=tree 
Key=2 VAL=tree 
Key=2 VAL=tree 
Key=2 VAL=tree 
Key=2 VAL=tree // till the $i is 10 therefore it's exits the foreach trough break; 

,我已經嘗試過上一個($數組);沒有結果。

我也一直在思考

while(true) 
{ 
    if(server exists) 
    { 
     echo "server is good"; 
     break; 
    } 
    else 
    { 
     echo "server is BAD ... continueing"; 
     prev($Array); 
    } 
} 

但這並沒有爲我工作要麼... 任何人都可以幫我這個?

回答

0

這適合您需要:

$arr = array('one', 'two', 'three', 'four'); 
$val = null; 
for ($i = 0; $i < 10; $i++) { 
    if (isset($arr[$i])) { 
    $val = $arr[$i]; 
    } 
    echo 'key=' . $i . ' val=' . $val . '<br />'; 
} 
+0

這被困在「四」而不是「樹」對我來說。 – jn1kk 2012-02-07 13:48:27

+0

它實際上是重複鍵= 3 val = 4,想象服務器2停機,並且四個在線...這不會幫助我,主要原因是跳過離線服務器 – Master345 2012-02-07 13:51:03

+0

嗯,在他的例子中錯過了那個部分。我想他只是想重複數組中最後找到的元素並繼續重複它。如果他想在開始之前跳過最後一個簡單的array_pop(),那麼就應該這樣做。 – RobinUS2 2012-02-07 13:52:26

0

http://php.net/manual/en/control-structures.foreach.php

問題#1:

當foreach開始執行時,內部數組指針自動復位到的所述第一元件陣列

星期四s,你的第一個next()調用是無用的。

問題#2:

作爲的foreach依賴於內部數組指針在循環內改變,可能導致意外的行爲。

0

Foreach非常適合數組,如skynorth提到的有限大小。

爲此,我會推薦一個Do While循環來保證循環的至少一次執行,以便您在服務器上執行檢查。

+0

正如我所見http://thenewboston.org/watch.php?cat=14&number=9雖然只是一段時間以上的事情...我不明白他的邏輯... – Master345 2012-02-07 13:55:50

+0

雖然執行第一次使用大括號內的代碼,然後進行比較。 – kaleeway 2012-02-07 14:01:56

+0

是的,就像有一個正常的,而有一段代碼高於 – Master345 2012-02-07 14:06:27

0

我覺得你這樣的事情後:

<?php 
$myArray = array('one','two','tree','four'); 
$length = count($myArray); 
$attempts = 0; 

for ($i = 0; $i < $length; ++$i) { 
    echo 'Key=' . $i . ' VAL=' . $myArray[$i] . '<br>'; 
    if ($i === 2) { 
     --$i; 
    } 

    if (attempts >= 10) { 
     break; 
    } 
    ++$attempts; 
} 
?> 

注意事項。

無論數組的大小如何,在10次迭代後結束。如果你的數組長20個項目,這只是不會工作。

我假設你有一些你希望使用的實際條件,而不是檢查一個鍵值爲2的項目,在這種情況下,限制在特定條件下的嘗試而不是限制整個陣列 - 但你最瞭解你的要求,並可以要求更多的幫助,如果你想要它。

0
for ($i = 0; $i < count($Array) - 2; $i++) { 
    echo "Key=$i VAL={$Array[$i]}\n"; 
} 
for ($j = $i; $j < 10; $j++) { 
    echo "Key=$i VAL={$Array[$i]}\n";  
} 
+0

,你認爲它可以與http://neo22s.com/check-if-url-exists-and-is-在線-php /?我想但是......沒有結果,我需要知道服務器是否關閉,如果關閉,請轉到下一臺服務器 – Master345 2012-02-07 14:09:56

0

您可以在foreach循環不上一個($陣列),正如已經說過 您應該用while或for循環

但除此之外,你將面臨一些其他麻煩與反正迭代..

php是一種非常線性的語言,只要代碼是INSIDE這樣的循環它不能做任何事情,所以這個PHP必須作爲一個單獨的線程運行,並且它應該做一些事情(返回一個值)它不僅會鎖定自身,而且還會鎖定線程來捕獲該值。 它很可能會在一段時間後崩潰,您可以在該循環內擴展php max腳本執行時間以防止它死亡,但是您也必須對getter執行相同的操作。您不應該這樣做那(這就是爲什麼這裏沒有代碼)

所以,如果我有你的權利,你要訪問的遠程服務器上的文件...

你可以簡單地說:

while (!$handle) // file not opened i.e. server not accessible 
{ 
    $handle = fopen("http://www.example.com/", "r"); //try to fopen file 
} 

這隻要沒有設置$ handle,或者設置爲FALSE ,它也會被鎖定在循環內部,它會讓你的腳本死掉(通常爲60秒) 只要$ handle設置爲遠程服務器html輸出的文件句柄(在這種情況下),它將正常執行以下所有代碼 如果讀完$ handle,則不要忘記關閉它

fclose($handle);