【问题标题】:Laravel - Star rating - Optimization?Laravel - 星级 - 优化?
【发布时间】:2018-05-09 05:21:54
【问题描述】:

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

这是一个简单的代码来显示在数据库中的星级评分。

我搜索并尝试了@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-&gt;rate &lt;= 0

$review-&gt;rate === 3

$review-&gt;rate &gt;= 5

【问题讨论】:

标签: php laravel if-statement optimization blade


【解决方案1】:

不要重复自己。循环 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";
}

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

【讨论】:

  • 我不敢相信推荐的欺骗链接或关闭该问题的欺骗链接中没有提供这个简单的答案。
  • 这很好,但我不明白代码,如果我想加半星怎么办?比如如果标记是3.5,代码应该是:&lt;i class="fa fa-star" aria-hidden="true"&gt;&lt;/i&gt; &lt;i class="fa fa-star" aria-hidden="true"&gt;&lt;/i&gt; &lt;i class="fa fa-star" aria-hidden="true"&gt;&lt;/i&gt; &lt;i class="fa fa-star-half-o" aria-hidden="true"&gt;&lt;/i&gt; &lt;i class="fa fa-star-o" aria-hidden="true"&gt;&lt;/i&gt;
  • @LaynomGraphic 我添加了一个包含半星的新版本。这两种方法都遵循 Don't Repeat Yourself (DRY) 的基本编程理念。我的流程中只有两种类型的操作:循环和内联条件如果其中任何一种对您来说不熟悉,请自己了解并研究它们。
【解决方案2】:

在控制器中将评分四舍五入到 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

【讨论】:

    【解决方案3】:

    你可以通过下面的代码来实现

    @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
    

    【讨论】:

      【解决方案4】:

      试试这个方法:

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

      【讨论】:

      • 我看到你的帖子被否决了,这是正确的。我看着这个答案,想知道你是如何获得近 4000 个代表点的。我的意思是,首先它不起作用,但逻辑​​很愚蠢。您的代码唯一答案的解释在哪里?请删除此帖子,因为这是完全不可取的,只会浪费读者的时间。
      • @mickmackusa 嗯,从这段代码中你不明白什么(首先),我很乐意帮助你理解。应显示所有五个图标类。检查。仅按费率编号填写那些。检查。我真的很想看看这在哪里不起作用,并且链接将不胜感激。致 OP 你测试过这个吗?
      • 你测试过这个吗?您绝不会在页面上写满星。你只写-o(空星)。关于 aria,它不会“填充星星”,参考:stackoverflow.com/q/31107040/2943403 ...此外,即使这确实提供了预期的结果,它也没有优化——它很冗长。如果你觉得我的回答很有教育意义,你可以点赞。
      • @mickmackusa 休息一下。甚至没有,这完美无缺。有什么问题?在带有三元运算符的五行 HTML 中,它的工作方式类似于您的 20-30(多少?)行代码。评级系统的 HTML 不需要是动态的。寒意。咏叹调的链接点是什么?你似乎真的很困惑。 :(
      • @mickmackusa 关于 Silly™ 逻辑,10k 分您不了解哪一部分? :P
      【解决方案5】:

      我认为这就是你需要做的。不需要循环。只需确保 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) !!}
      

      【讨论】:

      • 仍然略有重复,但与您以前的方法相比,对于没有经验的开发人员来说更容易理解。 +1。现在很干净。
      猜你喜欢
      • 2021-11-25
      • 2021-09-04
      • 2021-05-31
      • 2015-01-10
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      相关资源
      最近更新 更多