0

我有:fullstar.png、halfstar.png、greystar.png

<?php
$average_stars = round(4);
for($i=0; $i<$average_stars; $i++)
{
    ?>
    <img src="<?php echo url::site('images/desktop/fullstar.png'); ?>" />
    <?php
}
for($i=5; $i>$average_stars; $i--)
{
    ?>
    <img src="<?php echo url::site('images/desktop/greystar.png'); ?>" />
    <?php
}
?>

这给了我,现在当 $average_stars 为 4 时,有 4 个 fullstars 和 1 个 graystar。

工作得很好。

现在我希望它能够工作并显示半颗星。

因此,如果它是 4.5,那么最后一颗星应该是半星。

我怎样才能做到这一点?我想我需要先让它工作,所以 round() 向上舍入到最接近的整数或最接近的整数.5

4

6 回答 6

1

从 0 到 5 星排名时使用半星与使用 10 颗满星有点相同。

一旦你的 10 颗星排名起作用,关键是根据索引使用不同的图像:每个偶数索引应该是星星的左侧部分,右侧应该是星星的右侧部分。

于 2013-09-29T16:58:39.980 回答
1
<?php

  $cfg_min_stars = 1;
  $cfg_max_stars = 5;

  $average_stars = 3.76;
  $temp_stars = $average_stars;

  for($i=$cfg_min_stars; $i<=$cfg_max_stars; $i++) {
    if ($temp_stars > 1) {
      print 'FULL ';
      $temp_stars--;
    }
    else {
      if ($temp_stars >= 0.5) {
        print 'HALF ';
        $temp_stars -= 0.5;
      }
      else {
        print 'GREY ';
      }
    }
  }
于 2013-09-29T17:18:22.020 回答
0

我想你会把它输出到html。

您可以制作两张具有最大星数的图像(一张用于全星,一张用于灰色)。将灰色星星放在父 DIV 背景中。然后在第一个 div 中添加另一个 div。这一次背景设置为全星图像,并将其宽度设置为第一个的百分比。不要忘记在这个 div 上设置溢出:隐藏。

我没有检查该代码,但它可能看起来像这样:

<div style="background-image:url(grey-5-stars.png); width: 50px;">
<div style="background-image:url(full-5-stars.png); width: <?= (50 * $stars / $maxStars) ?>px; ">
&nbsp;
</div>
</div>

现在你总是显示所有的灰色星星,并用一定百分比的完整星星覆盖它们。这样,您将不会仅受半颗星的限制。

于 2013-09-29T17:07:24.090 回答
0

很简单:

<?php
$stars=4.7449;
$average_stars = round($stars*2)/2;
for($i=0; $i<floor($average_stars); $i++)
{
    ?>
    <img src="<?php echo url::site('images/desktop/fullstar.png'); ?>" />
    <?php
}
if(floor($average_stars)!=$average_stars)
{?>
   <img src="<?php echo url::site('images/desktop/halfstar.png'); ?>" />
<?php
}

for($i=5; $i>ceil($average_stars); $i--)
{
    ?>
    <img src="<?php echo url::site('images/desktop/greystar.png'); ?>" />
    <?php
}
于 2013-09-29T17:08:40.833 回答
0
<?php

    $number = 3.5;
    $average_stars = round($number * 2) / 2;
    $drawn = 5;
    for ($i = 0; $i < floor($average_stars); $i++)
    {
        $drawn--;
        echo ' fullstar';
    }

    if ($number - floor($average_stars) == 0.5)
    {
        $drawn--;
        echo ' halfstar';
    }

    for($i = $drawn; $i > 0; $i--)
    {
        echo ' greystar';
    }

?>
于 2013-09-29T17:17:54.573 回答
0

为了娱乐 ...

现场观看:http ://sandbox.onlinephpfunctions.com/code/84c3a6d9de3170227841d6fd3dce0c2a0b10dd9e

<?php

    $stars_for_fun = function($avg, $max) {
      $avg = round($avg, 2);
      $starly = str_repeat('FULL ', floor($avg)).str_repeat('HALF ', round( ($avg-floor($avg)), 0, PHP_ROUND_HALF_UP)).str_repeat('GREY ', round(($max-$avg)-0.01, 0, PHP_ROUND_HALF_UP) );
      print $avg.': '.$starly.'<br>';

    };

    //$cfg_min_stars = 1;
    $cfg_max_stars = 5;

    $stars_for_fun(3.76, $cfg_max_stars);
    $stars_for_fun(3.5, $cfg_max_stars);
    $stars_for_fun(2.51, $cfg_max_stars);
    $stars_for_fun(2.49, $cfg_max_stars);
    $stars_for_fun(2.01, $cfg_max_stars);
    $stars_for_fun(1.99, $cfg_max_stars);
    $stars_for_fun(0.99, $cfg_max_stars);
    $stars_for_fun(0.51, $cfg_max_stars);
    $stars_for_fun(0.50, $cfg_max_stars);
    $stars_for_fun(0.49, $cfg_max_stars);
    $stars_for_fun(0.01, $cfg_max_stars);

?>
于 2013-09-29T18:30:23.390 回答