2015-10-14 54 views
-3

基本上我試圖做一個簡單的5星級評分系統,使用字體真棒類爲明星。如何使此PHP功能更有效

全明星

<i class="fa fa-star"></i> 

無星級

<i class="fa fa-star-0"></i> 

半星

<i class="fa fa-star-half-0"></i> 

通過每個審查我的服務所以我喜歡環路下面看到:

$i=0; 
$reviewRating = 0; 

foreach($service['reviews'] as $review){ 
    $i++; 
    $reviewRating += $review['rating']; 
} 

從這裏我現在有評論數量和所有評論總數加起來。

我通過這兩個值進入我的功能,如下圖所示:

function get_rating_stars($reviewRating,$i){ 
    //rounding number to nearest .5 
    $rating = round($reviewRating/$i * 2)/2; 
    $cnt = 0; 
    $class = "";//class active gives the star a colour, if empty it shows as a empty star. 
    $zeros = false;//this is for when we have gone past the .5 meaning any further stars have to be a zero(empty star). 
    $starList ="";//This will be returned when built up 

    while($cnt < 5){//because there will always be 5 stars showing, regardless to full half or empty 
     if($zeros){ 
      $starList.= '<li><i class="fa fa-star-o"></i></li>'; 
      $cnt++; 
     }else{ 
      if($rating == 0.5){ 
       $starList.= '<li class="active"><i class="fa fa-star-half-o"></i></li>'; 
       $zeros = true;//now we have output the half star all following will be empty 
       $cnt++; 
      }else{ 
       //the first loop will normally start here unless rating starts at 0.5 
       if($rating > 0.5){$class = "active";}else{$class = "";} 
       $starList.= '<li class="'. $class .'"><i class="fa fa-star"></i></li>'; 
       $cnt++; 
       $rating--; 
      } 
     } 
    } 
    return $starList; 
} 

所以這個功能我提出做這樣的伎倆,準確的工作如何我想它也一樣,但是它有重複這個過程爲頁面上的每一項服務。所以當我循環遍歷所有的服務時,我會循環執行每個檢查,然後執行此操作,這看起來有點過分了。

這個函數理論上可以調用20次,因爲我可以在一個頁面上顯示20個服務。

有誰知道我可以如何使這更有效?

+0

它是否真的很慢?或者你只是在猜測(暗示 - 不要猜測,簡介) – Steve

+0

以及它並不完全很慢。但是,看起來似乎過分矯枉過正,後面還會創建很多其他的PHP函數,所以我試圖儘可能提高每個函數的效率。 –

+0

我不知道如何改進當前的實現,但是怎麼樣:使用平均評分來創建CSS類,比如'fa-star-3'(3.0)和'fa-star-4_5'(4.5),然後改變提供評分的方式。 ;) –

回答

2

我寫了這個函數(從你的)。雖然如果它的工作,那麼你的應該沒問題。

我不知道,如果我的速度比你的要快,所以它只是一個選擇。 (另外我認爲我的閱讀有點容易,但這只是首選)

function get_rating_stars($reviewRating,$i){ 
    // Calculate Rating 
    $rating   = max(0, min(5, round($reviewRating/$i * 2)/2)); 
    $halfStar  = (int)$rating != $rating; 
    $arrayResult = array_fill(0, $rating, '<li class="active"><i class="fa fa-star"></i></li>'); // Full Stars 
    if($halfStar){ 
     $arrayResult[] = '<li class="active"><i class="fa fa-star-half-o"></i></li>'; // One half Star 
    } 
    $arrayResult = array_pad($arrayResult, 5, '<li><i class="fa fa-star-o"></i></li>'); // Empty Start 
    return implode('', $arrayResult); 
} 
+0

$ seperatorHTML在哪裏進入函數? –

+0

測試代碼的餘數。 – Christian