2013-06-19 98 views
2

我只是問自己什麼更快:我有一個for循環,我必須檢查一個特定的表列對我的循環變量。什麼是更快?在循環中觸發查詢或循環通過數組?

現在我有兩個選擇:在循環中,我爲每個迭代啓動一個查詢並檢查我的結果。第二種方法是獲取我需要的所有行,並在我的for循環中運行foreach循環,並檢查我的期望字段和循環變量之間是否有有效的匹配。

這有點難以解釋,但我只是讓代碼說話。我不在循環中使用實際代碼,而是通過插圖方式虛構函數調用。

選項1:查詢每次迭代的數據庫。

<?php 

// Option 1: 

for($i = 0; $i < 5; $i++) 
{ 
    $query_result = query_database_where_field_equals($i); 
    if($query_result) 
    { 
     echo "Here is something"; 
    } 
    else 
    { 
     echo "Here is nothing"; 
    } 

} 

// Option 2: 

$results = query_database_and_get_all_results(); 

for($i = 0; $i < 5; $i++) 
{ 

    foreach($results AS $result) 
    { 
     if($result['desired_field'] == $i) 
     { 
      echo "Here is something"; 
     } 
     else 
     { 
      echo "Here is nothing"; 
     } 
    } 

} 

?> 

這兩種方式的工作,但我敢肯定,這是一個糟糕的做法是觸發一個循環內的查詢在視高性能的點。

但是在for循環中使用foreach循環對我來說似乎也有點奇怪。

那麼這樣做的首選方式是什麼?

編輯 - 添加信息

我有一個for循環,需要多次運行。金額是靜態的(例如5),並且不依賴於數據庫中的任何記錄。每次迭代都代表一個位置。

我有一個數據庫表,它可能存儲有關位置包含的信息。

例子:

positions (id, position) 

所以的示例記錄可能是: 位置(1,2)

這意味着,我有2位我想在我的循環來基本上什麼東西是爲了檢查我是否得到了該職位的記錄。預期的輸出爲:

Here is nothing 
Here is nothing 
Here is something 
Here is nothing 
Here is nothing 

回答

1

上述兩個答案都是正確的。
@Euantorano:代碼迭代優於查詢。您將避免較慢的數據庫訪問,並避免數據庫過載。
不過,正如Slaks所說,你可以添加WHERE條件,那樣會減少你的數組。改善循環中的性能以檢查存在性。

最後,我會建議獲得一個單一的bucle索引結果,所以你可以檢查結果是否設置。

$res = array(); 
$results = query_database_and_get_all_results(); 
for($results as $r) { 
    $res[$result['desired_field']] = $r; 
} 
for($i = 0; $i < 5; $i++) { 
    echo (isset($res[i]) ? "Here is something" : "Here is nothing"); 
} 

該代碼爲您提供了基於數組大小+第二個bucle的持續性能。 根據您的需要,更好的查詢實際上可以帶來更好的性能,但這是基於您的具體問題。
希望它有幫助!

+0

這麼簡單但非常有效!這是一個「感覺很好」的解決方案。正如我所說的那麼簡單,但我無法想出這個! :) 謝謝 – thpl

0

都不是。

你應該把循環到查詢,使用WHERE field IN (0, 1, 2, 3, 4)

+0

我想你讓我錯了(沒有意外,我的英語太可怕了)。由於迭代量是固定的/靜態的,我需要for循環。即使沒有給定ID的記錄,我也想顯示數據。 – thpl

1

第二個選擇是最好的兩個給出的選項,但我們知道的一些詳細信息,它到底是什麼你通過循環和查詢可以幫助你會得到更好的答案。

+0

我添加了一些額外的信息並添加了預期的輸出。謝謝:) – thpl