Laravel - 星级 - 优化?

Laravel - Star rating - Optimization?

其实这不是问题,但我想知道是否可以优化下面的代码。

这是一个简单的代码,用于显示数据库中的星级标记。

我搜索并尝试了@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

$review->rate === 3

$review->rate >= 5

不要重复自己。循环5次写一个条件判断star是否应该为空

代码:(演示: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";
}

如果您不了解内联条件语法,google 只需点击一下即可。

我认为这就是您需要做的全部。不需要循环。在将其传递给视图之前,只需确保 rate 值介于 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) !!}

试试这个方法:

<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>

您可以通过以下代码完成

@foreach(range(1,5) as $i)
    @if($rating >0)
        @if($rating >0.5)
            <i class="fa fa-star"></i>
        @else
            <i class="fa fa-star-half-o"></i>
        @endif
    @else
        <i class="fa  fa-star-o"></i>
    @endif
    <?php $rating--; ?>
@endforeach

在控制器中将评分四舍五入为 0.5

$rating = round($number*2)/2;

将评级传递给视图并添加此代码:

    @for($x = 5; $x > 0; $x--)
    @php 
        if($rating > 0.5){
            echo '<i class="fas fa-star"></i>';
        }elseif($rating <= 0 ){
            echo '<i class="far fa-star"></i>';
        }else{
            echo '<i class="fas fa-star-half-alt"></i>';
        }
        $rating--;      
    @endphp
@endfor