带有比较运算符和小数位的PHP脚本逻辑

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)

我正在开发网络应用程序并做出(也许是愚蠢的)决定尝试制定评级系统而不是实施其他人的评级系统。

以下是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正在循环中击中半星形选项。如何调整第二个参数以避免这种情况发生?

任何帮助赞赏。

提问于
用户回答回答于

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的函数中。

用户回答回答于

你需要改变条件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++;
}

扫码关注云+社区

领取腾讯云代金券