#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. Не совсем то, чего я ожидал. Но я ценю ваши отзывы!