【问题标题】:PHP script logic with comparison operators and decimal place带有比较运算符和小数位的 PHP 脚本逻辑
【发布时间】:2019-10-21 11:19:22
【问题描述】:

我正在开发网络应用程序,并做出了(可能是愚蠢的)决定尝试建立一个评级系统,而不是实施其他人的。

以下是网络应用程序的屏幕截图。十进制值是从数据库中检索的值。我正在使用以下逻辑将值转换为星形表示。

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

任何帮助表示赞赏。

【问题讨论】:

    标签: php comparison system rating


    【解决方案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】:

      strpos() 函数将始终输出真,因为它输出一个位置,在布尔逻辑下不是 0(假)。

      除此之外,对于一个非常简单的问题,您的代码似乎过于复杂,我会以不同的方式解决这个问题。 一定要用小数作为数值,然后用它来生成星数。 解析句号似乎很傻。

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

      【讨论】:

      • 我如何将它与我的变量 $this->retreat->total_review_food_rating 一起使用
      • function stars($x) { *enter code above* } 然后在函数外:stars($this-&gt;retreat-&gt;total_review_food_rating);
      • 你能解释一下为什么这会使用更少的资源吗?
      • 当然,所以显示的星星总数将是一个线性运行时间O(n),或者给定n个预期的星星,它应该运行n次,即我的解决方案是做什么的。该问题使 for 循环运行 n 次,直到小数点前的最后一个整数。然后strpos() 函数在 O(m) 的线性时间内运行一次,其中 m 是您正在解析的字符串中的位数。在此之后,while 循环将仅在评级低于 1 的情况下运行,但也仅在您使用 '.' 格式化评级字符串的情况下运行。第一的。总的来说,你的代码很臃肿。
      【解决方案3】:
      $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 将转换为 int 0 或 1。)

      $empty_stars = 5 - ($full_stars + $half_star);
      echo str_repeat('<i class="far fa-star"></i>', $empty_stars);
      

      【讨论】:

        猜你喜欢
        • 2012-07-16
        • 1970-01-01
        • 2015-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多