Отображение звездного рейтинга с потрясающими значками шрифтов

#php

Вопрос:

Хотите отобразить оценку на основе значения, хранящегося в $averageScore. Значение варьируется от 0 до 5. Это то, что у меня есть в настоящее время, но выглядит раздутым, и я ищу более чистое решение с помощью PHP:

 if( $averageScore = 0 amp;amp; $averageScore lt; 0.5 ) {  $starPattern = array('e', 'e', 'e', 'e', 'e'); } elseif( $averageScore gt;= 0.5 amp;amp; $averageScore lt; 1 ) {  $starPattern = array('h', 'e', 'e', 'e', 'e'); } elseif( $averageScore gt;= 1 amp;amp; $averageScore lt; 1.5 ) {  $starPattern = array('f', 'e', 'e', 'e', 'e'); } elseif( $averageScore gt;= 1.5 amp;amp; $averageScore lt; 2 ) {  $starPattern = array('f', 'h', 'e', 'e', 'e'); } elseif( $averageScore gt;= 2 amp;amp; $averageScore lt; 2.5 ) {  $starPattern = array('f', 'f', 'e', 'e', 'e'); } elseif( $averageScore gt;= 2.5 amp;amp; $averageScore lt; 3 ) {  $starPattern = array('f', 'f', 'h', 'e', 'e'); } elseif( $averageScore gt;= 3 amp;amp; $averageScore lt; 3.5 ) {  $starPattern = array('f', 'f', 'f', 'e', 'e'); } elseif( $averageScore gt;= 3.5 amp;amp; $averageScore lt; 4 ) {  $starPattern = array('f', 'f', 'f', 'h', 'e'); } elseif( $averageScore gt;= 4 amp;amp; $averageScore lt; 4.5 ) {  $starPattern = array('f', 'f', 'f', 'f', 'e'); } elseif( $averageScore gt;= 4.5 amp;amp; $averageScore lt; 5) {  $starPattern = array('f', 'f', 'f', 'f', 'h'); } elseif( $averageScore gt;= 5 ) {  $starPattern = array('f', 'f', 'f', 'f', 'f'); }  foreach( $starPattern as $ratingStar ) {  if( $ratingStar == 'e' ) {  echo 'lt;i class="far fa-star" text-yellowgt;lt;/igt;';  }  if( $ratingStar == 'h' ) {  echo 'lt;i class="fas fa-star-half-alt text-yellow"gt;lt;/igt;';  }  if( $ratingStar == 'f' ) {  echo 'lt;i class="fas fa-star text-yellow"gt;lt;/igt;';  } }  

У меня тоже есть что-то подобное, но оно не охватывает половину звезд. Я пытался совместить и то, и другое, но безуспешно.

 $value = $averageScore; for ($i = 1; $i lt;= 5; $i  ) {  if ($value gt;= $i) {  echo 'lt;i class="fas fa-star"gt;lt;/igt;' . PHP_EOL;  } else {  echo 'lt;i class="far fa-star"gt;lt;/igt;' . PHP_EOL;  } }  

Есть какие-нибудь мысли?

Ответ №1:

Я уверен, что есть еще более лаконичные способы сделать это, но вот один из способов сделать это немного более лаконичным, чем ваша первоначальная попытка:

 $averageScore = 2.5;  // get integer value of $averageScore $wholeStarCount = (int) $averageScore; // get integer value of 5 - $averageScore $noStarCount = (int) (5 - $averageScore); // is $averageScore - $wholeStarCount larger than 0? $hasHalfStar = $averageScore - $wholeStarCount gt; 0;  $stars = str_repeat('lt;i class="fas fa-star text-yellow"gt;lt;/igt;' . PHP_EOL, $wholeStarCount) .  ($hasHalfStar ? 'lt;i class="fas fa-star-half-alt text-yellow"gt;lt;/igt;' . PHP_EOL : '') .  str_repeat('lt;i class="fas fa-star"gt;lt;/igt;' . PHP_EOL, $noStarCount);   echo $stars;  

Пример $averageScore = 2.5 печатает:

 lt;i class="fas fa-star text-yellow"gt;lt;/igt; lt;i class="fas fa-star text-yellow"gt;lt;/igt; lt;i class="fas fa-star-half-alt text-yellow"gt;lt;/igt; lt;i class="fas fa-star"gt;lt;/igt; lt;i class="fas fa-star"gt;lt;/igt;  

Конечно, вы могли бы сделать его более кратким, опустив промежуточные переменные в начале и поместив выражения непосредственно в конкатенацию строк. Я просто хотел поместить их сверху для ясности.

Комментарии:

1. Спасибо! Это сработало именно так, как и ожидалось. Таким образом, мой код выглядит намного чище.

Ответ №2:

Вот моя попытка сделать это.

Я написал эти функции:

 //Check if value is float/decimal  function is_decimal($val){  return is_numeric($val) amp;amp; floor($val) != $val; }  function printWholeStars($var){  for ($i = 0; $i lt; $var; $i  ) {  echo 'lt;i class="fas fa-star text-yellow"gt;lt;/igt;';  } }  function printHalvStars(){  echo 'lt;i class="fas fa-star-half-alt text-yellow"gt;lt;/igt;'; }  function printEmptyStars($totalStars,$var){  $emptyStars= floor($totalStars-$var);  for ($i = 0; $i lt; $emptyStars; $i  ) {  echo 'lt;i class="far fa-star"gt;lt;/igt;';  } }   function printScores($totalStars, $averageScore){  if (is_decimal($averageScore)) {  $averageScoreRound=floor($averageScore);  printWholeStars($averageScoreRound);  printHalvStars();  printEmptyStars($totalStars,$averageScore);  }else{  printWholeStars($averageScore);  printEmptyStars($totalStars,$averageScore);  } }  

Затем используйте их:

 $averageScore = 1.5; $totalStars = 5;  printScores($totalStars,$averageScore);  

Выход:

 lt;i class="fas fa-star text-yellow"gt;lt;/igt; lt;i class="fas fa-star-half-alt text-yellow"gt;lt;/igt; lt;i class="far fa-star"gt;lt;/igt; lt;i class="far fa-star"gt;lt;/igt; lt;i class="far fa-star"gt;lt;/igt;  

Комментарии:

1. Спасибо! Это возвращает 4 пустые звезды и одну половину звезды со средним баллом 4,55. Но спасибо за ваш вклад!

2. @Jonathan Извините, я ввел неправильный код FontAwesome в звездочки для печати — я исправил это сейчас

Ответ №3:

Я бы попробовал что-нибудь в этом роде.

 $fullCount = floor($averageScore); $hasHalf = ($averageScore % 1 gt; .5) ? true : false;  for ($i = 1; $i lt;= $fullCount; $i  ) { // Add full stars  echo 'lt;i class="fas fa-star"gt;lt;/igt;' . PHP_EOL; } if ($hasHalf) { // Add half star  echo 'lt;i class="fas fa-star-half-alt text-yellow"gt;lt;/igt;'.PHP_EOL; } for ($i = 1; $i lt;= 5 - $fullCount; $i  ) { // Add empty stars  echo 'lt;i class="far fa-star"gt;lt;/igt;' . PHP_EOL; }  

Комментарии:

1. Спасибо за ваш вклад! Это возвращает только 4 полные звезды со средним баллом 4,55. Не совсем то, чего я ожидал. Но я ценю ваши отзывы!