希望根據 $averageScore 中存盤的值顯示分數。該值從 0 到 5 不等。這是我目前擁有的,但看起來很臃腫,我正在尋找一個更干凈的 PHP 解決方案:
if( $averageScore = 0 && $averageScore < 0.5 ) {
$starPattern = array('e', 'e', 'e', 'e', 'e');
} elseif( $averageScore >= 0.5 && $averageScore < 1 ) {
$starPattern = array('h', 'e', 'e', 'e', 'e');
} elseif( $averageScore >= 1 && $averageScore < 1.5 ) {
$starPattern = array('f', 'e', 'e', 'e', 'e');
} elseif( $averageScore >= 1.5 && $averageScore < 2 ) {
$starPattern = array('f', 'h', 'e', 'e', 'e');
} elseif( $averageScore >= 2 && $averageScore < 2.5 ) {
$starPattern = array('f', 'f', 'e', 'e', 'e');
} elseif( $averageScore >= 2.5 && $averageScore < 3 ) {
$starPattern = array('f', 'f', 'h', 'e', 'e');
} elseif( $averageScore >= 3 && $averageScore < 3.5 ) {
$starPattern = array('f', 'f', 'f', 'e', 'e');
} elseif( $averageScore >= 3.5 && $averageScore < 4 ) {
$starPattern = array('f', 'f', 'f', 'h', 'e');
} elseif( $averageScore >= 4 && $averageScore < 4.5 ) {
$starPattern = array('f', 'f', 'f', 'f', 'e');
} elseif( $averageScore >= 4.5 && $averageScore < 5) {
$starPattern = array('f', 'f', 'f', 'f', 'h');
} elseif( $averageScore >= 5 ) {
$starPattern = array('f', 'f', 'f', 'f', 'f');
}
foreach( $starPattern as $ratingStar ) {
if( $ratingStar == 'e' ) {
echo '<i text-yellow></i>';
}
if( $ratingStar == 'h' ) {
echo '<i ></i>';
}
if( $ratingStar == 'f' ) {
echo '<i ></i>';
}
}
我也有類似的東西,但它不包括半顆星。我一直試圖將兩者結合起來,但沒有成功。
$value = $averageScore;
for ($i = 1; $i <= 5; $i ) {
if ($value >= $i) {
echo '<i ></i>' . PHP_EOL;
} else {
echo '<i ></i>' . PHP_EOL;
}
}
有什么想法嗎?
uj5u.com熱心網友回復:
我敢肯定還有更簡潔的方法可以做到這一點,但這里有一種比您最初的嘗試更簡潔的方法:
$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 > 0;
$stars = str_repeat('<i ></i>' . PHP_EOL, $wholeStarCount) .
($hasHalfStar ? '<i ></i>' . PHP_EOL : '') .
str_repeat('<i ></i>' . PHP_EOL, $noStarCount);
echo $stars;
一個例子$averageScore = 2.5列印:
<i class="fas fa-star text-yellow"></i>
<i class="fas fa-star text-yellow"></i>
<i class="fas fa-star-half-alt text-yellow"></i>
<i class="fas fa-star"></i>
<i class="fas fa-star"></i>
您當然可以通過在開頭省略中間變數并將運算式直接放入字串連接中來使其更加簡潔。為了清楚起見,我只是想把它們放在最上面。
uj5u.com熱心網友回復:
我會沿著這些方向嘗試一些東西。
$fullCount = floor($averageScore);
$hasHalf = ($averageScore % 1 > .5) ? true : false;
for ($i = 1; $i <= $fullCount; $i ) { // Add full stars
echo '<i ></i>' . PHP_EOL;
}
if ($hasHalf) { // Add half star
echo '<i ></i>'.PHP_EOL;
}
for ($i = 1; $i <= 5 - $fullCount; $i ) { // Add empty stars
echo '<i ></i>' . PHP_EOL;
}
uj5u.com熱心網友回復:
體面的 Dabblers 的答案看起來比我的好,但這是我的繼續。
我寫了這些函式:
//Check if value is float/decimal
function is_decimal( $val )
{
return is_numeric( $val ) && floor( $val ) != $val;
}
function printWholeStars($var){
for ($i = 0; $i < $var; $i ) {
echo '<i text-yellow></i>';
}
}
function printHalvStars(){
echo '<i ></i>';
}
function emtyStars($var){
$emptyStars= floor(5-$var);
for ($i = 0; $i < $emptyStars; $i ) {
echo '<i ></i>';
}
}
function printScores($averageScore){
if (is_decimal($averageScore)) {
$averageScoreRound=floor($averageScore);
printWholeStars($averageScoreRound);
printHalvStars();
emtyStars($averageScore);
}else{
printWholeStars($averageScore);
emtyStars($averageScore);
}
}
然后使用它們:
$averageScore = 1.5;
printScores($averageScore);
輸出:
<i class="far fa-star" text-yellow></i>
<i class="fas fa-star-half-alt text-yellow"></i>
<i class="far fa-star"></i>
<i class="far fa-star"></i>
<i class="far fa-star"></i>
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/365229.html
標籤:php
上一篇:HTTPS客戶端認證自簽名證書
下一篇:如何從選擇選項中獲取php值?
