2013-01-08 56 views
-4

我有一個我需要應用一些邏輯的數組列表,我的數據庫中的每個元素都引用了一個類別。在foreach循環之外移動count()

到目前爲止,我在使用foreach循環中的計數來統計類別在我的數據庫中應用了多少次。有什麼辦法可以將這個計數移到我的foreach循環之外嗎?到目前爲止,它並沒有真正運行緩慢,基準爲0.00241899490356。

但我有超過150個類別的方法,每個被循環並計數6次。我擔心隨着類別使用量和數據庫空間的增加,它會變得緩慢。我讀到數據庫操作不應該在循環中。在類似的情況下,這是否正確和可原諒的做法?

編輯::我真的很抱歉我的代碼不足。我通常首先概述問題,然後填寫漏洞。我的時間用完了。不是一個馬虎的藉口,但它是我有。在閱讀當前回覆之前,我會立即修復。

$nazioni = array(
     'ad' => array('eur',), 
     'ae' => array('asi',), 
     'af' => array('asi',), 
     'ag' => array('nam',), 
     'al' => array('eur',), 
     'am' => array('asi', 'eur',), 
     ... 
     'za' => array('afr',), 
     'zm' => array('afr',), 
     'zw' => array('afr',), 
    ); 

    $categorie = array(
     'eur', 
     'asi', 
     'afr', 
     'nam', 
     'sam', 
     'oce', 
    ); 

    echo '<ul>'; 
    foreach($categorie as $cat) 
    { 
     echo '<li><a href="#">'.$cat.'</a></li>'; 
     echo '<ul>'; 
     foreach($nazioni as $n=>$c) 
     { 
      if(array_intersect(array($cat), $c) == true) 
      { 
       echo Filtra::uri_locale($n, $cat, $uri); 
      } 
     } 
     echo '</ul>'; 
    } 
    echo '</ul>'; 
} 

計數是在我的Filtra :: uri_locale動作中完成的。

public static function uri_locale ($n, $cat, $uri) 
{ 
    $count = DB::table('recipes') 
    ->where(function($query) 
    { 
     $corso = Filtra::corso(explode("/", URI::current())); 
     if(!empty($corso)) 
     { 
      $query->where_in('course', $corso, 'OR'); 
     } 
    }) 
    ->where('nation', '=', $n)->count(); 

    //if more than 0, or not empty and in the uri array. 
    if($count > 0 || !empty($uri) && array_intersect(array($n), $uri)) 
    { 
     return self::uri_href($uri, $n, $count); 
     // ex: returns a link named Italy (3) if Italy has 3 results counted. 
    } 
} 

我的相關數據庫表我在尋找起來:

| id | title | nation | course | 
———————————————————————————————— 
| 1 | Pizza | it  | 4  | 

它被翻譯成意大利,當然是用於歸類的另一層它採用了類似的邏輯,同樣的解決方案相同的問題。

再一次,真的很抱歉這混亂,我的方式在我的頭和截止日期。

+7

ü也許應該包括一些代碼 – KTastrophy

+3

很難想像這樣的問題。請添加一些代碼。 –

+0

你可以使用array_count_values()來計算數組中有多少個值。 – Anonymous

回答

2

由於您沒有提供任何有關您的PHP代碼或數據庫的信息,請讓我做出一些假設和答案。我們假設1,你好,世界是你的分類。

您可以通過兩種方式對其進行優化。

方法1

<?php 
$array = array(1, "hello", 1, "world", "hello"); 
print_r(array_count_values($array)); 
?> 

O/P

Array 
(
    [1] => 2 
    [hello] => 2 
    [world] => 1 
) 

方法2

您可以使用數據庫功能COUNT()這一點。

SELECT category, COUNT(*) FROM category_table GROUP BY category; 

O/P

+--------+----------+ 
|category| COUNT(*) | 
+--------+----------+ 
| 1  |  2 | 
| hello |  2 | 
| world |  1 | 
+--------+----------+ 

如果您有任何問題,讓我知道

+0

Group_by做到了。非常感謝您抽出寶貴時間回答,並再次表示歉意,因爲未在原始文章中包含代碼。 –

0

您可以使用一些變量來存儲每個類別的計數。那麼你可以測試變量是否爲空值,否則你將計數。