2010-10-15 47 views
1

啓動同一迴路我有PHP代碼如下所示:與無論是同時或foreach語句

while($r = mysql_fetch_array($q)) 
{ 

// Do some stuff 

} 

其中$ q是一個查詢檢索羣組成員集合。但是,某些組中有成員保存在memcached中,並且memcached值以$ mem_entry的形式存儲在數組中。爲了貫徹這一點,我通常會做以下事情

foreach($mem_entry as $k => $r) 
{ 

// Do some stuff 

} 

這是問題所在。我不希望有兩個完全相同的代碼塊(//做一些東西部分)嵌套在兩個不同的循環中,這是因爲在一種情況下,我必須將mysql用於循環和其他memcached。有什麼方法可以用while或foreach切換循環嗎?換句話說,如果$ mem_entry有一個非空值,循環的第一行將是foreach($ mem_entry爲$ k => $ r),或者如果它是空的,循環的第一行將是while $ R = mysql_fetch_array($ q))

編輯

好,幾乎幾秒鐘後,我寫了這個,我結束了與解決方案來。圖一我會留給任何可能遇到這個問題的人。我首先將$ members的值設置爲memcached值。如果這是空白的,我運行mysql查詢並使用while循環將所有記錄傳輸到名爲$ members的數組。然後我使用foreach啓動循環($ members,如$ k => $ r)。基本上,我每次都使用foreach循環,但是$ member的值根據memcached中是否存在值來設置不同。

回答

0

不是理想的解決方案,但我會給你我的2美分。理想的做法已經調用一個函數,但如果你不想這樣做,那麼,你可以嘗試這樣的事:

if(!isset($mem_entry)){ 
$mem_entry = array(); 
while($r = mysql_fetch_array($q)) 
{ 

    $mem_entry[] = $r; 

} 
} 

的想法是隻使用foreach循環做實際工作中,如果有在memcache中什麼都沒有,然後用mysql中的東西填充你的mem_entry數組,然後將它提供給你的foreach循環。

+0

我剛剛完成更新我的帖子說做同樣的事情。它只是打我,我應該修改數組而不是循環:)我標記這是正確的答案,因爲它包含代碼。謝謝。 – user396404 2010-10-15 09:22:28

3

爲什麼不重構doSomeStuff()作爲從每個循環中調用的函數。是的,你需要看看這是否會導致性能下降,但除非有重大意義,否則這是一種避免代碼重複的簡單方法。

如果您有建議切換的方法,我不知道。

+0

doSomeStuff部分大約有600行代碼,並且必須將9個變量設置爲全局範圍才能作爲函數運行,其中3個是mysql鏈接。這種情況多次發生。將它作爲一個函數來運行對於性能來說太不利了。 – user396404 2010-10-15 09:08:02

+1

哇。我接受過培訓,認爲功能應該足夠短以適應個人屏幕。對於解釋代碼,它可能會有所不同,但是我很難不認爲在重構之後你可能會更快樂。 – 2010-10-15 09:25:09

+0

另外,您可以將數據對象傳遞給doSomeStuff(),而不是全局化變量。如果你需要doSomeStuff來設置一堆變量,你可以讓它返回一個數據對象。如果需要獲取並設置一堆變量,則可以通過引用傳入數據對象。 (要清楚的是,在一個數據對象可能只是一個數組。) – 2010-10-15 09:29:35