2014-01-18 46 views
1

陣列對於一個WordPress插件,我使用的一個簡單的查詢$wpdb像:檢查狀態== 1或0,而不從PHP環

global $wpdb; 
$table = $wpdb->wp_table_name = $wpdb->prefix . "wp_table_name"; 

$the_query = $wpdb->get_results(
    "SELECT * 
     FROM $table; 
    "); 

它給陣列狀(使用var_dump()):

array 
    0 => 
    object(stdClass)[342] 
     public 'id' => string '1' (length=1) 
     public 'name' => string 'The Name' (length=8) 
     public 'status' => string '1' (length=1) 
    1 => 
    object(stdClass)[341] 
     public 'id' => string '2' (length=1) 
     public 'name' => string 'The Name 2' (length=10) 
     public 'status' => string '0' (length=1) 

在視圖列表我要顯示像一個簡單的計數器:

Total: 2; Active: 1; Inactive: 1 

對於總,我使用簡單count()

<?php echo count($the_query); ?> 

它工作正常。現在我想顯示其他兩個數字,但[如果可能] 沒有任何迴路

我想使用很多循環會減慢頁面的速度。我搜查了很多,他們建議in_array()array_key_exists()。但他們似乎搜索索引,他們無法檢查它是否爲== 1或0.

+0

'$ the_query [0] ['status']'? –

+0

現在不能測試這個,但是你可以通過轉換爲「int」來求和一個布爾數組嗎?我正在考慮Matlab的'sum(myArray == value)'的php等價物。 – Floris

+0

2查詢狀態== 1和計數,狀態0與計數。這是我的解決方案沒有循環解決方案:),但循環是我認爲最好的。 – FoPi

回答

2

與其他反應達成一致,循環是不是天生壞。在這種情況下,循環可能是最簡單的方式來獲得你的後續。

有許多方法可以通過使用更多功能的樣式來避免循環,例如使用array_reduce。例如。

$active = array_reduce($the_query, function ($result, $item) { 
    if ($item->status === '1') { 
    return $result + 1; 
    } 
    return $result; 
}); 

var_dump($active); 

雖然,這仍然會執行一個循環,它將被抽象爲底層的C實現。

無論這是否是一個性能改善,我不確定(我懷疑不)。你必須剖析你的代碼。這主要是一種文體選擇。

這裏的例子工作的鍵盤:http://codepad.viper-7.com/JFzUga

+0

*「雖然這仍然會執行一個循環」* - 因此「非活動」搜索會有另一個基礎循環,na? :( –

+1

如果「active」和「inactive」是互斥的(看起來他們是),我只會做'$ inactive = $ total - $ active;' –

+0

Yap,好吧。:) –

3

在您的特定情況下使用循環是一個很好的解決方案。您應該避免在沒有必要的情況下使用循環,但是這種特殊情況非常有意義。

您可能想要限制查詢返回到合理數字(如每頁10或15個)的結果數。循環使用10-15個項目並沒有太大區別,特別是當你沒有更好的方法來獲得最終結果時。

當然,如果您不需要帖子中的所有數據(例如帖子正文),那麼也可以根據您的要求限制SQL返回的列數或更好的查詢。

+0

限制結果的數量不會給你一個完整和準確的計數。 – BlackHatSamurai

0

使用循環不會對您的資源造成嚴重影響。如果你想檢查一個數組的特定值,你將不得不使用一個循環。這不像你解析大數據或任何東西,所以使用循環不會那麼糟糕。這是循環的目的。你想要避免的是使用嵌套for循環或嵌套循環。對於你正在嘗試做的循環來說很好。

循環是編碼的基本構建塊。你想避免的是嵌套循環,並在循環內循環之後進行循環。使用單個循環具有(O)n的運行時間。當你開始嵌套循環時,你指數增長。嵌套for循環將是(O)n^2,3個嵌套循環將是(O)n^3等等。這是它變得糟糕的地方。所以不要害怕在數組中使用循環。

然而,如果你真的不想使用循環,一種方法是做2個以上的查詢,你可以在其中有多少個活動/不活動的條目。

這可能是這樣的:

SELECT COUNT(*) FROM $table WHERE status = 1; 

SELECT COUNT(*) FROM $table WHERE status = 0; 

這樣做將是對使用循環計數的資源比較密集,但它是一個選項。就個人而言,我只會循環當前的數組。

+0

執行多個查詢將對性能產生較大影響,然後僅對一小部分數據使用循環。 –

+0

@LuckySoni查詢不會總是需要更長時間或更密集。如果你有一個索引數組和大量的數據,那麼做2個查詢會更快。但是,對於一小部分數據來說,是的,循環會更快。 – BlackHatSamurai

0

嘗試使用SUM()

SELECT COUNT(id) AS total, SUM(IF(status =1, 1, 0)) AS active, 
SUM(IF(status =0, 1, 0)) AS inactive 
FROM $table 
+0

嵌套查詢,不是一個好主意! –

+0

沒錯。恐怕,更多的數據庫查詢將是一個簡單的計數事情最糟糕的。 –

+0

已更新查詢 –

0

可以利用get_var,而不是直接get_results

<?php 
$active_user_count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->users where status=1"); 
echo "<p>Active user count is {$active_user_count}</p>"; 

$inactive_user_count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->users where status=0"); 
echo "<p>Inactive user count is {$inactive_user_count}</p>"; 
?> 

希望它可以幫助

+0

'm against more SQL查詢。 :( –