2017-11-25 303 views
0

事實上這不是問題,但我想知道是否可以優化下面的代碼。Laravel - 星級評分 - 優化?

這是一個簡單的代碼來顯示數據庫中的星級評分標記。

我用@foreach搜索並嘗試,但無法弄清楚。

代碼:

<span class="review-stars" style="color: #1e88e5;"> 
<!-- ////////////// STAR RATE CHECKER ////////////// --> 
    @if($review->rate <= 0) 
     <i class="fa fa-star-o" aria-hidden="true"></i> 
     <i class="fa fa-star-o" aria-hidden="true"></i> 
     <i class="fa fa-star-o" aria-hidden="true"></i> 
     <i class="fa fa-star-o" aria-hidden="true"></i> 
     <i class="fa fa-star-o" aria-hidden="true"></i> 
    @elseif($review->rate === 1) 
     <i class="fa fa-star" aria-hidden="true"></i> 
     <i class="fa fa-star-o" aria-hidden="true"></i> 
     <i class="fa fa-star-o" aria-hidden="true"></i> 
     <i class="fa fa-star-o" aria-hidden="true"></i> 
     <i class="fa fa-star-o" aria-hidden="true"></i> 
    @elseif($review->rate === 2) 
     <i class="fa fa-star" aria-hidden="true"></i> 
     <i class="fa fa-star" aria-hidden="true"></i> 
     <i class="fa fa-star-o" aria-hidden="true"></i> 
     <i class="fa fa-star-o" aria-hidden="true"></i> 
     <i class="fa fa-star-o" aria-hidden="true"></i> 
    @elseif($review->rate === 3) 
     <i class="fa fa-star" aria-hidden="true"></i> 
     <i class="fa fa-star" aria-hidden="true"></i> 
     <i class="fa fa-star" aria-hidden="true"></i> 
     <i class="fa fa-star-o" aria-hidden="true"></i> 
     <i class="fa fa-star-o" aria-hidden="true"></i> 
    @elseif($review->rate === 4) 
     <i class="fa fa-star" aria-hidden="true"></i> 
     <i class="fa fa-star" aria-hidden="true"></i> 
     <i class="fa fa-star" aria-hidden="true"></i> 
     <i class="fa fa-star" aria-hidden="true"></i> 
     <i class="fa fa-star-o" aria-hidden="true"></i> 
    @elseif($review->rate >= 5) 
     <i class="fa fa-star" aria-hidden="true"></i> 
     <i class="fa fa-star" aria-hidden="true"></i> 
     <i class="fa fa-star" aria-hidden="true"></i> 
     <i class="fa fa-star" aria-hidden="true"></i> 
     <i class="fa fa-star" aria-hidden="true"></i> 
    @endif 
    <!-- ///////////////////////////////////////////// --> 
</span> 

$review->rate <= 0 enter image description here

$review->rate === 3 enter image description here

$review->rate >= 5 enter image description here

+0

展(至少)的不同情況3個圖像時'$審查 - > rate'是0,1和4例如,讓我們知道它的外觀像在一起。 – Tpojka

+0

檢查答案:https://stackoverflow.com/a/47467912/2815635 – C2486

+0

可能重複的[檢索數字和轉成明星](https://stackoverflow.com/questions/47466404/retrieve-numbers-and-turn -as-star) – C2486

回答

1

不要Repea你自己。循環5次並寫入一個條件來檢查星星是否應該是空的。

代碼:(演示:https://3v4l.org/Tj31J

$review=(object)['rate'=>3]; 
for($i=0; $i<5; ++$i){ 
    echo '<i class="fa fa-star',($review->rate<=$i?'-o':''),'" aria-hidden="true"></i>'; 
} 

輸出:

<i class="fa fa-star" aria-hidden="true"></i> 
<i class="fa fa-star" aria-hidden="true"></i> 
<i class="fa fa-star" aria-hidden="true"></i> 
<i class="fa fa-star-o" aria-hidden="true"></i> 
<i class="fa fa-star-o" aria-hidden="true"></i> 

我在Laravel不編碼,糾正我,如果這個語法是有缺陷的:

@for ($i = 0; $i < 5; ++$i) 
    <i class="fa fa-star{{ $review->rate<=$i?'-o':'' }}" aria-hidden="true"></i> 
@endfor 

如果你想合併這個半空(又名半滿)的星星,只是增加了另一個條件。應用相同的設計邏輯,再添加一個條件來檢查恆星是否應該減半。下面是有效的收視率全電池測試:

代碼(見演示詳細輸出:https://3v4l.org/r4c6R

$reviews=[ 
    (object)['rate'=>0], 
    (object)['rate'=>.5], 
    (object)['rate'=>1], 
    (object)['rate'=>1.5], 
    (object)['rate'=>2], 
    (object)['rate'=>2.5], 
    (object)['rate'=>3], 
    (object)['rate'=>3.5], 
    (object)['rate'=>4], 
    (object)['rate'=>4.5], 
    (object)['rate'=>5] 
]; 
foreach ($reviews as $review){ 
    for($i=0; $i<5; ++$i){ 
     echo '<i class="fa fa-star', 
      ($review->rate==$i+.5?'-half':''), 
      ($review->rate<=$i?'-o':''), 
      '" aria-hidden="true"></i>'; 
     echo "\n"; 
    } 
    echo "\n"; 
} 

如果你不理解內聯有條件的語法,谷歌只是一個點擊即可。

+1

我不能相信這個簡單的答案沒有在推薦的dupe鏈接或dupe鏈接中提供那個問題是關閉的。 – mickmackusa

+0

這工作完美,但我不明白代碼,如果我想添加半星我該怎麼辦?就像標記是3一樣。5,代碼應該是: aria-hidden =「true」> ' –

+0

@LaynomGraphic我添加了一個包含半顆星的新版本。這兩種方法都遵循不要重複自己(DRY)的基本編程理念。在我的過程中,只有兩種類型的操作:循環和內聯條件如果其中任何一種對您而言都是外來的,請自我檢查並研究它們。 – mickmackusa

2

我認爲這就是你需要做的。無需循環。在將其傳遞給視圖之前,請確保rate的值介於0和5之間(包含0和5)。

{!! str_repeat('<i class="fa fa-star" aria-hidden="true"></i>', $review->rate) !!} 
{!! str_repeat('<i class="fa fa-star-o" aria-hidden="true"></i>', 5 - $review->rate) !!} 
+0

仍然有點重複,但更容易理解沒有經驗的開發人員與以前的方法。 +1。現在很乾淨。 – mickmackusa

-1

試試這個方法:

<i class="fa fa-star{{ $review->rate <= 0 ? '-o' : '' }} aria-hidden="false"></i><!-- First case is for 0 and 1 case or empty and filled star --> 
<i class="fa fa-star{{ $review->rate >= 2 ? '-o' : '' }} aria-hidden="false"></i> 
<i class="fa fa-star{{ $review->rate >= 3 ? '-o' : '' }} aria-hidden="false"></i> 
<i class="fa fa-star{{ $review->rate >= 4 ? '-o' : '' }} aria-hidden="false"></i> 
<i class="fa fa-star{{ $review->rate >= 5 ? '-o' : '' }} aria-hidden="false"></i> 
+0

我發現你的帖子已經被低估了,正確的。我看着這個答案,並想知道你有多近4000個重要點。我的意思是,首先它不起作用,但邏輯​​是愚蠢的。你的代碼的解釋只回答在哪裏?請刪除這篇文章,因爲它是完全不可取的,只會浪費讀者的時間。 – mickmackusa

+0

@mickmackusa嗯,你從這段代碼中不瞭解什麼(首先),我會很樂意幫助你理解。應顯示所有五個圖標類。經過。只填寫費率編號。經過。我真的很想看看這不起作用,鏈接將不勝感激。到OP你有沒有測試過這個? – Tpojka

+0

你測試過這個嗎?你從來沒有寫過一個充滿星星的頁面。你只寫'-o'(空星)。關於詠歎調,它不會 「填滿星星」,參考:https://stackoverflow.com/q/31107040/2943403 ...此外,即使這確實提供了所需的結果,它並沒有優化 - 它是冗長的。如果你覺得它有教育意義,你可以提高我的答案。 – mickmackusa