我正在开发web应用程序,并做出了一个(也许是愚蠢的)决定,尝试建立一个评级系统,而不是实现其他人的评级系统。
下面是这个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在循环中命中半星选项。我如何调整第二个参数以避免这种情况发生?
感谢您的帮助。
发布于 2019-06-06 07:54:07
$rating = $this->retreat->total_review_activities_rating;
满星的数量是评分的整数部分。
$full_stars = (int) $rating;
echo str_repeat('<i class="fas fa-star"></i>', $full_stars);
如果评分的小数部分超过您选择的某个值,则显示半星。
$half_star = $rating - $full_stars > 0.2; // 0.2 for example
echo $half_star ? '<i class="fas fa-star-half-alt"></i>' : '';
剩余的空星数量是可能的符号总数(5)减去到目前为止显示的符号数量。(布尔型$half_star
将转换为整数0或1。)
$empty_stars = 5 - ($full_stars + $half_star);
echo str_repeat('<i class="far fa-star"></i>', $empty_stars);
发布于 2019-06-06 07:09:43
您需要使用strpos
更改条件,这始终是正确的。
例如,比较AVG和integer。
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++;
}
https://stackoverflow.com/questions/56469089
复制相似问题