打印评论明星并使用PHP使其动态化

时间:2014-11-14 11:07:40

标签: php html

我正在尝试使用PHP自动化HTML代码。我的任务是打印评论星 - 在亚马逊和许多其他网站上用于计算平均评分。 我想要实现的是这种模式。

  

姓名:
评级:
Desciption:

为了达到这个目的,我使用foreach循环来打印数组中的值。我对名称和描述没有任何问题,但是根据我使用foreach从数组中获得的计数,我在打印评论星时遇到问题。
我有这个HTML代码,可以打印星星。

<ul class="review-rating star-rating">
<li><span class="fa fa-1x fa-star"></span></li>
</ul>

以上HTML将打印1颗星。

    <ul class="review-rating star-rating">
    <li><span class="fa fa-1x fa-star"></span></li>
    <li><span class="fa fa-1x fa-star"></span></li>
    <li><span class="fa fa-1x fa-star-half-empty"></span></li>
    <li><span class="fa fa-1x fa-star-o"></span></li>
    <li><span class="fa fa-1x fa-star-o"></span></li>
    </ul>

以上HTML将打印2.5星。

现在,我想根据我从PHP获得的计数值来自动化HTML。假设对于一个特定的数组,我将计数设为3.因此,无需在5行中编写此HTML代码,如何在PHP中自动执行它。 我认为的一种方法是使用9个语句:5个满星,4个半(1.5,2.5,3.5,4.5)。但这又是一项繁琐的工作。

另一个选择是在JQuery中自动化它,这也是一个问题,因为前端开发人员不会这样做。

所以,我正在尝试使用上面给出的相同设计搜索解决方案。

我可以就此提出一些建议吗?

3 个答案:

答案 0 :(得分:3)

这是我在PHP端渲染星星的功能

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;
}

希望有所帮助

答案 1 :(得分:1)

你可以用这个:

<?php
/* Function helper to round numbers on .5 step, as 1, 1.5, 2, 2.5... */
function round_half($num) {
    return round($num * 2) / 2;
};
function print_stars($num) {
    echo '<ul class="review-rating star-rating">';
    for ($n=1; $n<=5; $n++) {
        echo '<li><span class="fa fa-1x fa-star';
        if ($num==$n+.5) {
            echo '-half-empty';
        } elseif ($num<$n+.5) {
            echo '-o';
        };
        echo '"></span></li>';
    };
    echo '</ul>';
};
$rating = round_half( 3.452 );
print_stars($rating);
?>

使用jQuery,它将与Fiddle中一样:

<ul class="review-rating star-rating" data-stars="3.5">
    <li><span></span></li>
    <li><span></span></li>
    <li><span></span></li>
    <li><span></span></li>
    <li><span></span></li>
</ul>
<script type="text/javascript">
    $.fn.print_stars = function() {
        return this.each(function() {
            var thisList = $(this);
            var thisRating = thisList.data('stars');
            thisList.find('li span').each(function(m) {
                var n = m+1;
                var thisClass='fa fa-1x fa-star';
                if (thisRating==n+.5) {
                    thisClass += '-half-empty';
                } else if (thisRating<n+.5) {
                    thisClass += '-o';
                };
                $(this).attr('class', thisClass);
            });
        });
    };
    $(document).on('ready', function() {
        $('.star-rating').print_stars();
    });
</script>

答案 2 :(得分:0)

<?php
/* Function helper to round numbers on .5 step, as 1, 1.5, 2, 2.5... */
function round_half($num) {
     return round($num * 2) / 2;
}
function print_stars($num,$review=0) {
    echo '<div class="rating">';
    for ($n=0; $n<5; $n++) {
        echo '<span class="fa fa-star';
        if ($num==$n+.5) {
            echo '-half-o';
        } elseif ($num<$n+.5) {
            echo '-o';
        };
        echo '"></span>';
    }
    echo "<span class='rate'>(".$review.")</span>";
    echo '</div>';
}
$rating = round_half( 3.452 );
print_stars($rating);
?>