Как я могу создать функцию для цвета в порядке убывания

Я создаю функциональность для создания изображения, как это Ссылка на изображение
Я имею в виду, что я хочу отобразить цвет как

  1. 0% -1% от зеленого до светло-зеленого
  2. 1% -3% от желтого до светло-желтого
  3. От 3% до 5% от оранжевого до светло-оранжевого
  4. 5% — от 6 до темно-красного

В настоящее время я думаю, что это возможно только при условии if else.

Я делаю это следующим образом:

 function getBackground($val) {
if($val<=0.3)
return "#0A3A0A";
if($val< 0.5)
return "#1E4E1E";
if($val< 1)
return "#508050";

if($val< 1.4)
return "#FFFF0A";
if($val< 1.8)
return "#FFFF1E";
if($val< 2)
return "#FFFF32";
if($val< 2.4)
return "#FFFF46";
return "red";
}

и в HTML таким образом. Это в цикле 1-15

 $class=getBackground($val);
echo "<li style='background:{$class}'>{$val}%</li>";

но я не думаю, что это хорошее решение, потому что я должен создать, если еще для каждого условия.

Есть лучший способ сделать это? если да, то, пожалуйста, предложите это мне.

Обновить:

Основная проблема:

Цвета будут вести себя так, если они равны 0,2%, цвет будет ярко-зеленым, а если он равен 0,6%, то он будет светло-зеленым и так далее. Если оно составляет 0,9%, оно станет зеленым.

Я ищу решение для отображения другого цвета, например, если значение равно 0,1, то темно-зеленое, если оно на 0,1 меньше темно-зеленого ………………….. 0,9, тем светлее зеленый. аналогично, если val равен 1.1, то темно-желтый. если на 1,2 меньше темно-желтого … 1,9 светлее желтого. что-то вроде этого

2

Решение

Это должно работать для вас:

Просто поместите ваши цвета в массив с определенным диапазоном. Затем переберите все цвета и, если $val находится в диапазоне назначить цвет $class и разорвать петлю.

<?php

$arr = [
"green" => ["start" => 0, "end" => 1],
"yellow" => ["start" => 1, "end" => 3],
"orange" => ["start" => 3, "end" => 5],
"red" => ["start" => 5, "end" => 6],
];

$class = "default";
foreach($arr as $color => $range) {
if($val <= $range["end"] && $val >= $range["start"]) {
$class = $color;
break;
}
}

?>

РЕДАКТИРОВАТЬ:

Начиная с вашего обновленного кода, это должно работать для вас:

<?php

$arr = [
["start" => 0, "end" => 0.3, "color" => "#0A3A0A"],
["start" => 0.3, "end" => 0.5, "color" => "#1E4E1E"],
["start" => 0.5, "end" => 1, "color" => "#508050"],
["start" => 1, "end" => 1.4, "color" => "#FFFF0A"],
["start" => 1.4, "end" => 1.8, "color" => "#FFFF1E"],
["start" => 1.8, "end" => 2, "color" => "#FFFF32"],
["start" => 2, "end" => 2.4, "color" => "#FFFF46"],
];

$class = "red";
foreach($arr as $range) {
if($val <= $range["end"] && $val >= $range["start"]) {
$class = $range["color"];
break;
}
}

?>

РЕДАКТИРОВАТЬ 2:

Поскольку вам не нужны «статические» значения, это должно работать для вас:

<?php

$arr = [
["start" => 0, "end" => 0.8, "colorStart" => "FFE6E6", "colorEnd" => "4C0000", "interval" => ""],
["start" => 0.8, "end" => 1.8, "colorStart" => "C2FFC2", "colorEnd" => "296629", "interval" => ""],
["start" => 1.8, "end" => 2.7, "colorStart" => "C2C2FF", "colorEnd" => "6666FF", "interval" => ""],
];$arr = array_map(function($v){
$steps = intval((($v["end"] - $v["start"]) * 10));
list($redStart, $greenStart, $blueStart) = array_map("hexdec", str_split($v["colorStart"], 2));
list($redEnd, $greenEnd, $blueEnd) = array_map("hexdec", str_split($v["colorEnd"], 2));

$interval = sprintf("%02d", intval(($redStart - $redEnd) / $steps)) . sprintf("%02d", intval(($greenStart - $greenEnd) / $steps)) . sprintf("%02d", intval(($blueStart - $blueEnd) / $steps));
return array_merge($v, ["interval" => $interval]);
}, $arr);$val = 1.1;
$class = "FF0000";
foreach($arr as $range) {
if($val < $range["end"] && $val >= $range["start"]) {
$class = "";
$multiplier = intval((($val - $range["start"]) * 10));
list($redAdd, $greenAdd, $blueAdd) = array_map(function($v)use($multiplier){return dechex($v*$multiplier);}, str_split($range["interval"], 2));
list($redStart, $greenStart, $blueStart) = str_split($range["colorStart"], 2);
list($redEnd, $greenEnd, $blueEnd) = str_split($range["colorEnd"], 2);

$colors = ["red", "green", "blue"];

foreach($colors as $color) {
if(hexdec(${$color . "End"}) > hexdec(${$color . "Start"}))
$r = hexdec(${$color . "Start"}) + hexdec(${$color. "Add"});
else
$r = hexdec(${$color . "Start"}) - hexdec(${$color. "Add"});
$class .= sprintf("%02X", ($r >= 0 && $r <= 255 ? $r : ($r<0?0:255)));
}

break;
}
}

echo "<div style='hight:100px;width:200px;background-color:#$class;'>some text</div>";

?>

демонстрация

4

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

Других решений пока нет …

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