Будет ли массив более эффективным, чем случай переключения для этого сценария?

Я отображаю звездные рейтинги на основе входных данных от API (примечание: только отображение, а не получение оценок вообще). Следующий код работает именно так, как мне нужно, но это очень большой кусок логики для чего-то, что кажется, что это может быть значительно упрощено.

Я прочитал несколько других тикетов, которые предполагают, что использование массива может быть более эффективным, чем случай переключения. Но поскольку логика зависит от каждого случая между истиной в диапазоне чисел (например, больше 2,5, но меньше 3), я не уверен, что в этом случае массив будет работать вообще.

Итог таков: может ли этот код быть существенно упрощен каким-либо образом?

$stars = 3.5;

switch ($stars) {
case ($stars > 1 && $stars <= 1.5):
$star2 = 'dashicons-star-half';
$star3 = 'dashicons-star-empty';
$star4 = 'dashicons-star-empty';
$star5 = 'dashicons-star-empty';
break;
case($stars > 1.5 && $stars <= 2):
$star2 = 'dashicons-star-filled';
$star3 = 'dashicons-star-empty';
$star4 = 'dashicons-star-empty';
$star5 = 'dashicons-star-empty';
break;
case($stars > 2 && $stars <= 2.5):
$star2 = 'dashicons-star-filled';
$star3 = 'dashicons-star-half';
$star4 = 'dashicons-star-empty';
$star5 = 'dashicons-star-empty';
break;
case($stars > 2.5 && $stars <= 3):
$star2 = 'dashicons-star-filled';
$star3 = 'dashicons-star-filled';
$star4 = 'dashicons-star-empty';
$star5 = 'dashicons-star-empty';
break;
case($stars > 3 && $stars <= 3.5):
$star2 = 'dashicons-star-filled';
$star3 = 'dashicons-star-filled';
$star4 = 'dashicons-star-half';
$star5 = 'dashicons-star-empty';
break;
case($stars > 3.5 && $stars <= 4):
$star2 = 'dashicons-star-filled';
$star3 = 'dashicons-star-filled';
$star4 = 'dashicons-star-filled';
$star5 = 'dashicons-star-empty';
break;
case($stars > 4 && $stars <= 4.5):
$star2 = 'dashicons-star-filled';
$star3 = 'dashicons-star-filled';
$star4 = 'dashicons-star-filled';
$star5 = 'dashicons-star-half';
break;
case($stars > 4.5):
$star2 = 'dashicons-star-filled';
$star3 = 'dashicons-star-filled';
$star4 = 'dashicons-star-filled';
$star5 = 'dashicons-star-filled';
break;
default:
$star2 = 'dashicons-star-empty';
$star3 = 'dashicons-star-empty';
$star4 = 'dashicons-star-empty';
$star5 = 'dashicons-star-empty';
}

?>
<div class="wporg-ratings" title="<?php echo $stars; ?> out of 5 stars" style="color:#e6b800;">
<span class="dashicons dashicons-star-filled"></span>
<span class="dashicons <?php echo $star2; ?>"></span>
<span class="dashicons <?php echo $star3; ?>"></span>
<span class="dashicons <?php echo $star4; ?>"></span>
<span class="dashicons <?php echo $star5; ?>"></span>
</div>

0

Решение

Я не думаю, что массив или переключатель необходимы. Вы можете использовать цикл for и проверить $stars значение против вашей переменной цикла, чтобы увидеть, какой значок следует использовать.

<div class="wporg-ratings" title="<?php echo $stars; ?> out of 5 stars" style="color:#e6b800;">
<?php
// for loop: one iteration for each of five possible stars
// (for loops are generally best for repeating code a specific number of times)
for ($i=0; $i < 5; $i++) {
if ($stars <= $i ) {
// empty stars are displayed when the iterator (i) is >= the star value
echo  '<span class="dashicons dashicons-star-empty"></span>';
} elseif ($stars <= $i + 0.5) {
// half stars are displayed for star values between i and i+0.5
echo  '<span class="dashicons dashicons-star-half"></span>';
} else {
// whole stars are displayed when the star value is > i+0.5
echo  '<span class="dashicons dashicons-star-filled"></span>';
}
}
?>
</div>

Чтобы понять, почему это работает, возьмите теоретическое значение через цикл. Мы можем использовать тот из вашего вопроса, 3.5,

  • первая итерация: 3.5> 0, 3.5> 0.5, поэтому вы получите значение else (закрашенная звезда)
  • вторая итерация: 3,5> 1, 3,5> 1,5, поэтому вы получите значение else (закрашенная звезда)
  • третья итерация: 3,5> 2, 3,5> 2,5, поэтому вы получаете значение else (закрашенная звезда)
  • четвертая итерация: 3,5> 3, 3,5 = 3,5, так что вы получите значение elseif (половина звезды)
  • пятая итерация: 3,5 < 4, так что вы получите значение if (пустая звезда)
2

Другие решения

вот быстрая версия:

$stars = 3.5;
$d = array(
($stars >= 1.0) ? 'dashicons-star-filled' : (($stars >= 0.5) ? 'dashicons-star-half' : 'dashicons-star-empty'),
($stars >= 2.0) ? 'dashicons-star-filled' : (($stars >= 1.5) ? 'dashicons-star-half' : 'dashicons-star-empty'),
($stars >= 3.0) ? 'dashicons-star-filled' : (($stars >= 2.5) ? 'dashicons-star-half' : 'dashicons-star-empty'),
($stars >= 4.0) ? 'dashicons-star-filled' : (($stars >= 3.5) ? 'dashicons-star-half' : 'dashicons-star-empty'),
($stars >= 5.0) ? 'dashicons-star-filled' : (($stars >= 4.5) ? 'dashicons-star-half' : 'dashicons-star-empty')
);
echo '<div class="wporg-ratings" title="' . $stars . ' out of 5 stars" style="color:#e6b800;">';
foreach ($d as $value) echo '<span class="dashicons ' . $value . '"></span>';
echo '</div>';

это не то же самое, что ваша первоначальная логика (когда первая звезда всегда заполнена), но вы можете использовать ее как направление

Следующим шагом может быть перемещение повторного кода в функцию

1

Другая возможность — определить массив хэшей. Предположим, что каждый элемент в массиве содержит «минимальное значение и три строки» и что массив отсортирован в порядке возрастания. Ваша логика if / then может быть заменена циклом в этом массиве, разрывающимся при первой же возможности.

Тем не мение: «Ясность превосходит все другие проблемы. «Если код работает и разумно ли обслуживать, кого это волнует?

Ваш существующий код может быть упрощен, чтобы исключить возможность «проваливания трещин» любого значения, заметив, что первую половину условия if можно пропустить: если вы достигнете второго случая, должно быть верно, что значение больше чем 1,5 и так далее.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector