Логика PHP-скрипта с операторами сравнения и десятичным знаком - PullRequest
2 голосов
/ 06 июня 2019

Я занимаюсь разработкой веб-приложения и принял (возможно, глупое) решение попробовать создать систему рейтинга, а не внедрить чужую.

Ниже приведен скриншот веб-приложения.Десятичные значения - это значения, полученные из базы данных.Я использую следующую логику, чтобы превратить значение в представление в виде звезды.

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

enter image description here

Как вы можете видеть на скриншоте, значение 5.000 соответствует параметру половины звезды в цикле.Как я могу настроить второй аргумент, чтобы избежать этого?

Любая помощь приветствуется.

Ответы [ 3 ]

2 голосов
/ 06 июня 2019

Функция strpos() всегда выводит true, поскольку выводит позицию, которая в логической логике не равна 0 (false).

Помимо этого, ваш код кажется слишком сложным для довольно простой проблемы, к которой я бы подошел иначе. Определенно используйте десятичные дроби в качестве числовых значений, а затем используйте это для генерации числа звезд. Разбор за период кажется глупым.

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.

1 голос
/ 06 июня 2019
$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);
1 голос
/ 06 июня 2019

Вам нужно изменить условие с помощью 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++;
}
...