我正在开发Web应用程序,并做出了(也许很愚蠢的)决定,试图建立一个评级系统而不是实施别人的评级系统。
下面是该网络应用的屏幕截图。十进制值是从数据库中检索到的值。我正在使用以下逻辑将值转换为星形表示。
for($x=1;$x<=$this->retreat->total_review_activities_rating;$x++) {
echo '<i class="fas fa-star"></i>';
}
if (strpos($this->retreat->total_review_activities_rating,'.')) {
echo '<i class="fas fa-star-half-alt"></i>';
$x++;
}
while ($x<=5) {
echo '<i class="far fa-star"></i>';
$x++;
}
从屏幕截图中可以看到,值5.000在循环中达到了半星选项。如何调整第二个参数以避免发生这种情况?
任何帮助表示赞赏。
答案 0 :(得分:2)
strpos()
函数将始终输出true,因为它输出的位置在布尔逻辑下不为0(false)。
除此之外,对于一个非常简单的问题,您的代码似乎过于复杂,我可能会以其他方式处理。 绝对使用小数作为数值,然后使用它来生成许多星星。对该期间进行解析似乎很愚蠢。
while($x > 0) { //While there is still enough rating for a star left
if($x >= 0.75) {
//Add a full star
echo '<i class="fas fa-star"></i>';
$x--; //Remove one start rating
else if($x < 0.25) {
//Don't display a start
$x--; //There isn't enough left for a star so we must be done.
else {
//Display a half-star
echo '<i class="fas fa-star-half-alt"></i>';
$x--; //There is only enough for a half start left so we must be done
}
}
这是一个循环,不依赖于“极限”等级,并且比您的解决方案使用更少的处理时间。 甚至可以将其放入给定评级并返回星号html的函数中。
答案 1 :(得分:1)
您需要使用strpos
更改条件,这始终是正确的。
例如比较AVG和整数。
if ($this->retreat->total_review_activities_rating != (int)$this->retreat->total_review_activities_rating) {
// if (4.800 != 4) {true, show half star}
// if (5.000 != 5) {false, no half star}
echo '<i class="fas fa-star-half-alt"></i>';
$x++;
}
答案 2 :(得分:1)
value_ = request.form.get('email')
全颗星的数量是评分的整数部分。
$rating = $this->retreat->total_review_activities_rating;
如果评分的小数部分超过您选择的某个值,则显示半星。
$full_stars = (int) $rating;
echo str_repeat('<i class="fas fa-star"></i>', $full_stars);
剩余的空星数是可能的符号总数(5)减去到目前为止显示的符号数量。 (布尔值$half_star = $rating - $full_stars > 0.2; // 0.2 for example
echo $half_star ? '<i class="fas fa-star-half-alt"></i>' : '';
将转换为int 0或1。)
$half_star