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
其实这不是问题,但我想知道是否可以优化下面的代码。
这是一个简单的代码,用于显示数据库中的星级标记。
我搜索并尝试了@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