Дробный цикл

Статус
В этой теме нельзя размещать новые ответы.

d0ublezer0

Мой дом здесь!
Регистрация
21 Май 2009
Сообщения
367
Реакции
201
Помогите с куском кода, плз. Голова сломалась. Понимаю, что просто, но не вижу как )

Задача выводить 5 звезд, рейтинга. Каждая может быть включена полностью, включена наполовину или выключена

PHP:
$sscore     = 3.5; //текущий рейтинг 3.5 выбран для теста
for ($i = 0.5; $i <= 5; $i += 0.5) //шагаем по пол-позиции
{
    if ($i < $sscore) $star_class = "star-on"; //полные звезды для меньших значений
    if ($i == $sscore && is_int($sscore)) $star_class = "star-on"; // также полные для целых
    if ($i == $sscore && is_float($sscore)) $star_class = "star-half"; // ползвезды для дробных
    if ($i > $sscore) $star_class = "star-off"; // пустые для не достигших
    if ($i == intval($i) || $i == $sscore && is_float($sscore))
    {
        echo "<i class='$star_class'></i>";
    }
}
если оставить intval то выводится 5 звезд, но полу-звезда не показывается, а с моим условием - отображается одна звезда лишняя
 
Последнее редактирование:
Упс. Спасибо, но проблема не в этом. Эта ошибка допущена при формировании задания для форума.
В реальном коде $sscore рассчитывается по формуле и не может быть текстом:
PHP:
$sscore = $comment->ratings / 2;
 
Если закрыть глаза на общую костыльность кода, то вот так работает :)


Код:
$rating='7';
$sscore     = $rating/2; //текущий рейтинг
for ($i = 0.5; $i <= 5; $i += 0.5) //шагаем по пол-позиции
{
    if ($i < $sscore) $star_class = "star-on"; //полные звезды для меньших значений 
    if ($i == $sscore && is_int($sscore)) $star_class = "star-on"; // также полные для целых
    if ($i == $sscore && is_float($sscore)) $star_class = "star-half"; // ползвезды для дробных
    if ($i > $sscore) $star_class = "star-off"; // пустые для не достигших
   // var_dump($i,$sscore,is_float($sscore),$i == intval($i) , $i == $sscore && is_float($sscore));
    if ($i == intval($i) || $i == $sscore && is_float($sscore))
    {
        echo "<i class='$star_class'>$star_class</i><br />";
       
        if($star_class=='star-half') // Убираем 6 звезд
            $i += 0.5;
    }
}

Код:
star-on
star-on
star-on
star-half
star-off
 
вот так работает
Спасибо за попытку помочь.
Я в итоге сделал так:
PHP:
$sscore = $comment->rating/2;
$int_score = floor($sscore);
for ($i = 1; $i <= 5; $i++)
{
    if ($i <= $sscore) $star_class = "fa-star fa-star--on";
    if ($i > $sscore) $star_class = "fa-star-o fa-star--off";
    if ($i == $int_score && $sscore > $i) $star_class = "fa-star fa-star-half-o";
    echo "<i class='fa fa-fw $star_class'></i>";
}
 
Можно ещё исключить лишние проверки.

PHP:
$sscore = $comment->rating/2;
$int_score = floor($sscore);
for ($i = 1; $i <= 5; $i++) {
    if ($i <= $sscore) {
       $star_class = "fa-star fa-star--on"; 
    } else if ($i == $int_score && $sscore > $i) {
       $star_class = "fa-star fa-star-half-o";
    } else {
       $star_class = "fa-star-o fa-star--off";
    }
    echo "<i class='fa fa-fw $star_class'></i>";
}
 
А зачем это выводить на PHP?
Почему на PHP не передавать значение, и отрисовывать на JS? Так будет логичней... ИМХО
 
А почему нет? Предлагаете, чтобы не грузить сервер этой мелкой задачей, перевесить ее на браузер?
А для браузера это очень сложная задача?
Вы передаете в атрибут свои 3.5, потом на JS закрашиваете сколько надо звезд (добавляете классы).
Либо каким-нибуть фоном заливаете бекграунд в процентах.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху