2012-03-09 66 views
0

想象一下鍵0簡單,但是大陣爲100000Foreach鍵 - 可以在沒有「if(key <wheretoseek){continue;}」的情況下繼續前進?

在做這個數組的foreach循環,纔有可能「尋求」未來沒有做這樣的事情:

foreach($array as $key=>$value){ 
    if($key<10000){ 
     continue; 
    } 
} 

我們偶爾通過代碼庫進行這種操作。它接近像一個浪費蜱去通過每個鍵,直到關鍵是大於10000.

這是可能的PHP 5.4中?

謝謝。

+0

應該不錯用更精確的術語定義「偶爾一次」 – 2012-03-09 08:08:53

回答

5

它甚至在PHP 2.0FI或ALTAIR BASIC

for($i=10000;$i < count($array);$i++){ 
} 
是可能的

毫無疑問,一些nitpickers會告訴我做90000次也是浪費蜱。 但是,要獲得真實的性能增益,必須避免漫長的循環。

+5

這將工作,我會通過在foreach之前對count進行變量來進一步擴展,以便在每個循環中不執行count。 – 2012-03-09 08:02:06

+0

這是我們將從這一點開始使用的方法。儘管我必須注意到兩者(撰寫本文時)下面的答案都非常好。謝謝。 – 2012-03-09 08:05:39

+0

無法將性能提升考慮爲擺脫非必要的操作?在某些情況下,循環可能毫無疑問是必不可少的,但是,要計數的90000個呼叫不是。 (是的,我想這使得我nitpicker :)) – Corbin 2012-03-09 08:17:52

3
$rest = array_slice($array, 10000); 

取決於你想要達到的目標(在這裏:你想後求做什麼

for ($length = count($array), $key = 10000; $key < $length, $key++) { 
    $value = $array[$key]; 
} 
+0

我喜歡這個回答迄今爲止最好的。我會做一些基準測試,看看做一個array_slice和X的數量是多少if(key ... continue; added。 – 2012-03-09 08:03:15

+1

似乎像array slice將是低效率的,除非PHP的copy-on-write系統更先​​進比我想象的要複雜得多,不過我不太清楚這個問題。 – Corbin 2012-03-09 08:03:29

+0

@Corbin我同意這個觀點,但是這完全取決於數組的外觀,後面OP想要怎麼處理數組,以及多少如果OP不再需要第一個'X'元素,似乎沒有理由保留它們。 – KingCrunch 2012-03-09 08:11:41

1

假設鍵是連續整數:

$count = count($array); 
for ($key = 10000; $key < $count; ++$key) { 
    $value = $array[$key]; 
} 

我不知道,如果計數爲O(1)雖然如此,如果不是的話,你可能會更好做:

$key = 0; 
while (isset($array[$key])) { 
    $value = $array[$key]; 
    ++$key; 
} 

請注意,array_key_exists將是必需的,如果該鍵可能被認爲尚未設置存在數組中。

+0

我這麼認爲,因爲有$ arr [] = blah語法。否則,該聲明將是O(n),並且這將具有可怕的性能影響。現在我想到了,它肯定是O(1),無論如何對於數字鍵肯定是這樣。 – Corbin 2012-03-09 08:04:41

+1

請參閱[數組的PHP(),O(1)或O(n)?](http://stackoverflow.com/questions/5835241/phps-count-o1-or-on-for-arrays) – BoltClock 2012-03-09 08:04:46

+0

啊,如懷疑。我應該沒有懶惰,並自己搜索:)。謝謝。 – Corbin 2012-03-09 08:05:42

0

this solution借用,這將做的伎倆,並將數組指針設置在你想要的元素。這將是您搜索數組時最接近的,而不僅僅是指定要循環的鍵的間隔。

$start = 10000; // or what ever number you're starting at 
while(key($array) < $start) next($array); 

如果你打算使用foreach循環(因爲它重置指針)不能使用,但如果你遍歷數組的其餘部分是這樣

$count = count($array); 
do { 
    $key = key($array); 
    $value = current($array); 
} while($key < $count); 
+0

呃......這不就是他在他的問題中提到的非最佳解決方案的非標準語法嗎? – Corbin 2012-03-09 08:22:43

+0

這不是非標準的,因爲它有較少的操作,它應該是一個更有效的方式尋求。我給出瞭解決方案,因爲我想表明你不需要爲這類任務使用for-loops,並且儘可能精確地回答問題,而不是說這是對這個特定問題的最好或最有效的解決方案。 – Flygenring 2012-03-09 08:29:54

+0

在低級別上,我相當肯定這會是更多的操作。你說得對,但它的確在尋求。這是一個不同的解決方案。 – Corbin 2012-03-09 08:36:55

相關問題