2

我想知道编写以下 PHP 代码的最佳和最有效的方法是什么?

    if ($av == 1) echo '/images/1-star.png';
    if ($av > 1 && < 2) echo '/images/1-half-star.png';
    if ($av == 2) echo '/images/2-star.png';
    if ($av > 2 && < 3) echo '/images/2-half-star.png';

遵循相同的模式,最高 5 星。

4

7 回答 7

6

像这样使用:

$n = is_int($av) ? $av : floor($av) + 0.5;
echo '/images/'.$n.'-star.png';

在此处输入图像描述

每行剪切图像并将其命名为“1-star.png”、“1.5-star.png”、“2-star.png”、“2.5-star.png”、“3-start.png”、“3.5-星.png”等等...

于 2012-05-12T10:07:01.737 回答
6

这可能不是最有效的方法。但我发现它是干净的代码。检查这个。

function renderStarRating($rating,$maxRating=5) {
    $fullStar = "<li><i class = 'fa fa-star'></i></li>";
    $halfStar = "<li><i class = 'fa fa-star-half-full'></i></li>";
    $emptyStar = "<li><i class = 'fa fa-star-o'></i></li>";
    $rating = $rating <= $maxRating?$rating:$maxRating;

    $fullStarCount = (int)$rating;
    $halfStarCount = ceil($rating)-$fullStarCount;
    $emptyStarCount = $maxRating -$fullStarCount-$halfStarCount;

    $html = str_repeat($fullStar,$fullStarCount);
    $html .= str_repeat($halfStar,$halfStarCount);
    $html .= str_repeat($emptyStar,$emptyStarCount);
    $html = '<ul>'.$html.'</ul>';
    return $html;
}
于 2016-11-12T08:08:26.403 回答
2

我想开关盒将是最清晰且易于定制的

switch (true) {
  case  $av == 1 : 
  echo '/images/1-star.png';
  break;

  case  $av > 1 && $av < 2  : 
  echo '/images/1-half-star.png';
  break;

  case  $av == 2 : 
  echo '/images/2-star.png';
  break;

  case  $av > 2 && $av < 3  : 
  echo '/images/2-half-star.png';
  break;

  /***handle any other cases ****/ 
  default:
  echo '/images/0-star.png';
  break;
}

谢谢Dcoder,他给我指出了一个好主意

于 2012-05-12T10:09:23.817 回答
1

只有 4 个图像,一个完整的星形,一个一半,一个四分之一和一个四分之三。

打印满星多次abs($av),然后根据四舍五入的值打印另一个$av - floor($av)

这就是我为网站所做的,但他们不想只打印一半,还想要 3 个季度和 1 个季度的星星。但逻辑是一样的。

刚刚在 writecode 上在线测试了这段代码:

 $av = 3.5;

for ($i = 1; $i <= floor($av); $i++) {
    echo "<img src=http://www.leedshospitalalert.org.uk/images/star_shape.gif>";
}

$av2 = $av - floor($av);

if ($av2 > 0.2 && $av2 < 0.8) {
    echo "<img src=http://icdn.pro/images/en/h/a/half-star-icone-6015-48.png>";
} 
elseif ($av2 > 0.7) 
{
    echo "<img src=http://www.leedshospitalalert.org.uk/images/star_shape.gif>";
}
于 2012-05-12T10:39:02.753 回答
0

您可以计算以下数量:

$i = 2 * floor($av - 1) + (floor($av) == $av ? 0 : 1);

这将为您的值生成 numbers 0, 1, 2, ... ,然后您可以使用它来索引文件名数组。

于 2012-05-12T10:08:52.857 回答
0

您应该在每个标签中使用三元运算符而不是单选按钮

<span class="rating">
                                <input type="radio" id="star5" name="rate<?php echo $cnt; ?>" value="5" <?php echo ($row_avg_prod_rvw['AVG_Rating'] == '5') ? 'checked' : '' ?>/>
                                <label class = "full" for="star5" title="5 stars"></label>
                                <input type="radio" id="star4half" name="rate<?php echo $cnt; ?>" value="4.5" <?php echo ($row_avg_prod_rvw['AVG_Rating'] == '4.5') ? 'checked' : '' ?>/>
                                <label class="half" for="star4half" title="4.5 stars"></label>
                                <input type="radio" id="star4" name="rate<?php echo $cnt; ?>" value="4" <?php echo ($row_avg_prod_rvw['AVG_Rating'] == '4') ? 'checked' : '' ?>/>
                                <label class = "full" for="star4" title="4 stars"></label>
                                <input type="radio" id="star3half" name="rate<?php echo $cnt; ?>" value="3.5" <?php echo ($row_avg_prod_rvw['AVG_Rating'] == '3.5') ? 'checked' : '' ?>/>
                                <label class="half" for="star3half" title="3.5 stars"></label>
                                <input type="radio" id="star3" name="rate<?php echo $cnt; ?>" value="3" <?php echo ($row_avg_prod_rvw['AVG_Rating'] == '3') ? 'checked' : '' ?>/>
                                <label class="full" for="star3" title="3 stars"></label>
                                <input type="radio" id="star2half" name="rate<?php echo $cnt; ?>" value="2.5" <?php echo ($row_avg_prod_rvw['AVG_Rating'] == '2.5') ? 'checked' : '' ?>/>
                                <label class="half" for="star2half" title="2.5 stars"></label>
                                <input type="radio" id="star2" name="rate<?php echo $cnt; ?>" value="2" <?php echo ($row_avg_prod_rvw['AVG_Rating'] == '2') ? 'checked' : '' ?>/>
                                <label class = "full" for="star2" title="2 stars"></label>
                                <input type="radio" id="star1half" name="rate<?php echo $cnt; ?>" value="1.5" <?php echo ($row_avg_prod_rvw['AVG_Rating'] == '1.5') ? 'checked' : '' ?>/>
                                <label class="half" for="star1half" title="1.5 stars"></label>
                                <input type="radio" id="star1" name="rate<?php echo $cnt; ?>" value="1" <?php echo ($row_avg_prod_rvw['AVG_Rating'] == '1') ? 'checked' : '' ?>/>
                                <label class = "full" for="star1" title="1 star"></label>
                                <input type="radio" id="starhalf" name="rate<?php echo $cnt; ?>" value="0.5" <?php echo ($row_avg_prod_rvw['AVG_Rating'] == '0.5') ? 'checked' : '' ?>/>
                                <label class="half" for="starhalf" title="0.5 stars"></label>
                            </span>
于 2015-07-15T17:17:21.927 回答
-1

使用如果

if ($av==1){
    echo '/images/1-star.png';
} elseif($av > 1 && < 2){
    echo '/images/1-half-star.png';
} elseif ($av==2){
    echo '.....';
}                    // so far so forth

刚测试过。在此切换可能会产生不良结果。

于 2012-05-12T10:10:52.980 回答